EA不具合の修正(ニャン吉CFD-SMA)

前回の記事で報告していたEAの不具合を修正しました。
それに伴いコード公開のページでもEAコードを不具合修正済みの物へ入れ替えました。
念の為このページの下にも修正済みのコードを貼りつけておきます。

不具合の原因はiMA引数設定で終値の代わりに始値を使ってしまった事です。
よくよく読み返してみると移動平均線のiMA関数の引数設定が間違っていることは明らかだったんですよね。
恥ずかしい限りです(ノ_く。)

そしてこんないい加減なEAでも今のところは勝てています。
こればかりは運なのでしょうか。
いえ^^きっと日頃の行いが良いからですね!

ともあれ昨晩の値動きでも挙動がおかしかったので、もしかして終値を拾っていないのでは?と思いコードを見直してみると・・・その通りでした。
確かこのEAを作っていた当時はせめて1SMAだけでもPRICE_MEDIANを使っておいたほうが平均値になっていいのでは?と悩んでいたんです。
それがなぜかPRICE_OPEN、本当に何ででしょう?
しかも50SMAはPRICE_CLOSEで入力していたつもりでしたが、こちらもPRICE_OPENになっていました。

結果として不具合は修正されたのですが・・・昨晩のSP500値上がり中にこの作業をしていたので、中途半端に余り良くない場所でエントリーをしてしまいました。
このあと上がるか下がるかなんて誰にも分らない事ではありますが、一応下げに備えているニャン吉としては不満のあるエントリーとなってしまいました。
ああ(ノ_く。) これで年末は負けて終わるのでしょうか?
とりあえず1000pointsほど上がってほしいですね・・・

 

//+------------------------------------------------------------------+
//|                                                     ニャン吉CFD-SMA |
//|                         商用利用及び再配布を禁じます,c2021.8,ニャン吉ちゃんねる|
//|                                          https://ニャン吉ちゃんねる.com |
//+------------------------------------------------------------------+
#property copyright   "商用利用及び再配布を禁じます,c2021.8,ニャン吉ちゃんねる"
#property link        "https://ニャン吉ちゃんねる.com"

input int Magic =11;
input double Lot =10;
input double MAPeriod =50;
input double TakeProfit =1000;
input double StopLoss =1000;

   int CurrentOrder()
    {
   int cnt=0; 
   for(int i=0;i<OrdersTotal();i++) {   
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;     
      if(OrderType()==OP_BUY) {
         cnt++;
      }
      if(OrderType()==OP_SELL){
         cnt++;
      }   
    }
    return(cnt);
    }   

void OnTick(void)
  {
   double MA50c,MA50p,MA1c,MA1p;
   int    ticket;

   MA50c=iMA(NULL,0,MAPeriod,0,MODE_SMA,PRICE_CLOSE,0);
   MA50p=iMA(NULL,0,MAPeriod,0,MODE_SMA,PRICE_CLOSE,1);  
   MA1c=iMA(NULL,0,1,0,MODE_SMA,PRICE_CLOSE,0);
   MA1p=iMA(NULL,0,1,0,MODE_SMA,PRICE_CLOSE,1);

   if(CurrentOrder()<1)
     {   
    if(MA1p<=MA50c && MA50c<MA1c && MA50p<=MA50c)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,30,Ask-Point*StopLoss,Ask+Point*TakeProfit,NULL,Magic,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print("BUY order opened : ",OrderOpenPrice());
           }
         else
            Print("Error opening BUY order : ",GetLastError());
         return;
        }
      return;
     }       
    }

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です