エラーに悩まされ、取引業務がない - ページ 21

 
Arkadii Zagorulko:

まさにMT5...

MT4だけが問題だと言われる。

もしかしたら、MT5への乗り換えの妨害かも・・・。

 

もし誰かの参考になるなら、私がバリデーションに合格した方法を紹介します。ストップや注文の修正なしで、すべてのタイムフレームで 使用できるEAです。

Validatorはエラー131(間違ったロット)を出し、取引は行われませんでした。初めてのEAなので、失敗ばかりだったでしょう。

まず、EAが取引しない場合、Print()にエラーを出力するように、取引機能をチェックするためのすべての英語のコメントを追加しました。

また、フリーマージンのチェックを追加し、ExpertRemove()を削除しましたが、効果はなく、エラーは依然として同じままです。

void buy()
  {
   if(AccountFreeMarginCheck(Symbol(),OP_BUY,Lots)>0)
     {
      if(OrderSend(_Symbol,OP_BUY,Lots,Ask,Slip,SLb,0,comment,Magic,0,Green)<1)
         Print(" Buy ​​order error !"+ IntegerToString(_Period,0) +" Error code = " + IntegerToString(GetLastError(),0));
     }
   else
      Print("Not enough money!" +" Error code = " + IntegerToString(GetLastError(),0));
      /// ExpertRemove();
   return;   
  }

他にもいくつかの変更を一度に行ったのですが、どれが役に立ったのかわかりません。

Expert Advisorの最初と最後のエラーをリセットし、すべてのTFの相場をチェックしました。

int OnInit()
  {
    ResetLastError();   

      for(int cycle=1; cycle<=5; cycle++)
     {
      switch(cycle)
        {
         case 1:
            TF = PERIOD_D1;
            break;
         case 2:
            TF = PERIOD_H4;
            break;
         case 3:
            TF = PERIOD_H1;
            break;
         case 4:
            TF = PERIOD_M15;
            break;
         case 5:
            TF = PERIOD_M5;
            break;
        }
   if(iTime(_Symbol,TF,Limit)<1)
     Print("Missing quotes! " + IntegerToString(TF,0) + " Timeframe"+" Error = " + IntegerToString(GetLastError(),0));            
     }      
   return(INIT_SUCCEEDED);
  }
//****************************
void OnDeinit(const int reason)
  {  
   Alert("Error = "+ IntegerToString(GetLastError(),0));
   ResetLastError();
  }

で、ロット計算は、ステップが(0,1)、(0,01)、(0,001)であっても、すべてのケースで再計算されます。

double lotstep = MarketInfo(Symbol(),MODE_LOTSTEP);

   Lots = NormalizeDouble(AccountEquity()/10000*Lot_for_10K,3);
   if(lotstep>0.001)
   Lots = (MathRound(Lots/lotstep))*lotstep;    
   Lots = MathMax(Lots,MarketInfo(Symbol(),MODE_MINLOT));
   Lots = MathMin(Lots,MarketInfo(Symbol(),MODE_MAXLOT));

その結果、2日間と10回程度の試行錯誤で、すべての問題を解決することができました。

 
取引操作がない」状態での実験を説明しますと、

1.Marketから古いEAを再コンパイルし、サイトにアップロードしようとしたところ、「取引操作がありません」というエラーが表示されました。
test on EURUSD,H1
there are no trading operations
test on NZDUSD,H1
there are no trading operations
test on GBPUSDcheck,M30
there are no trading operations
test on XAUUSDcheck,Daily
there are no trading operations
2.すべてのTFの引用の有無をチェックしてもエラーは出ませんでした(0による除算を使いました)。
3.その後、取引操作の量を確認し始めたのですが、ずっと「取引操作がありません」というエラーが出ていました。
4.その後、すべてのOrderSendのロット数をSYMBOL_VOLUME_MINに 変更 - 「取引操作はありません」
5.明らかにバリデーター・テスターに問題がある。また、OnInit()でポジションのオープンを追加しようとしたところ、
double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
int ticket1=OpenPosition(NULL,OP_SELL,min_volume,0,0,magic);

と、こんな感じになりました(ちなみに、バリデータでここまで細かく見たのは初めてです)。

 2019.07.23 01:00:00  Tester: not enough money for sell 0.20 NZDUSD at 0.67567 sl: 0.00000 tp: 0.00000 [2019.07.23 01:00]
 2019.07.23 01:00:00  Tester: PrevBalance: 1.00, PrevPL: 0.00, PrevEquity 1.00, PrevMargin: 0.00, NewMargin: 135, FreeMargin: -134.14
 2019.07.23 01:00:00  Horizon_of_Infinity__1 NZDUSD,H1: OrderSend error 134
 2019.07.23 01:00:00  Tester: not enough money for sell 0.20 NZDUSD at 0.67567 sl: 0.00000 tp: 0.00000 [2019.07.23 01:00]
 2019.07.23 01:00:00  Tester: PrevBalance: 1.00, PrevPL: 0.00, PrevEquity 1.00, PrevMargin: 0.00, NewMargin: 135, FreeMargin: -134.14
 2019.07.23 01:00:00  Horizon_of_Infinity__1 NZDUSD,H1: OrderSend error 134
 2019.07.23 01:00:00  Tester: not enough money for sell 0.20 NZDUSD at 0.67567 sl: 0.00000 tp: 0.00000 [2019.07.23 01:00]
 2019.07.23 01:00:00  Tester: PrevBalance: 1.00, PrevPL: 0.00, PrevEquity 1.00, PrevMargin: 0.00, NewMargin: 135, FreeMargin: -134.14
 2019.07.23 01:00:00  Horizon_of_Infinity__1 NZDUSD,H1: OrderSend error 134
 2019.07.23 01:00:00  Tester: not enough money for sell 0.20 NZDUSD at 0.67567 sl: 0.00000 tp: 0.00000 [2019.07.23 01:00]
 2019.07.23 01:00:00  Tester: PrevBalance: 1.00, PrevPL: 0.00, PrevEquity 1.00, PrevMargin: 0.00, NewMargin: 135, FreeMargin: -134.14
 2019.07.23 01:00:00  Horizon_of_Infinity__1 NZDUSD,H1: OrderSend error 134
 2019.07.23 01:00:00  Tester: not enough money for sell 0.20 NZDUSD at 0.67567 sl: 0.00000 tp: 0.00000 [2019.07.23 01:00]
 2019.07.23 01:00:00  Tester: PrevBalance: 1.00, PrevPL: 0.00, PrevEquity 1.00, PrevMargin: 0.00, NewMargin: 135, FreeMargin: -134.14
 2019.07.23 01:00:00  Horizon_of_Infinity__1 NZDUSD,H1: OrderSend error 134


取引業務がない」というエラーは、ここですでに明らかです。残高が1.00であれば、当然0.20(SYMBOL_VOLUME_MIN)で注文を出すことはできません。コードで残高をチェックすると、そのような注文はできず、ジャーナルに十分な残高がないというプリントが表示されます (バリデータのみ表示されません)。

バリデーターはどうすればOKなのか?


バリデーターが修正されるまで待ちます。

 
無料のマージンは、ホンジュラスにうんざりしているので、気にならない。
 
Алексей Тарабанов #:
無料のマージンは気にしない、ホンジュラスにはうんざりしている。

難しいですか?表現の話です。

 
そうです、テストパラメータについてです
 
あらゆる記憶をクリアにする。
 

私は問題を発見しました。デフォルトでは、入力パラメータにポジションの最大ロットの制限を設けています。

input double MaxLots=0.1;
...
lots = MathMin(lots, MaxLots);

そのため、バリデータのSYMBOL_VOLUME_MINが 0.20の場合、ポジションを開くことが出来ませんでした。バリデータのデフォルトでは、ポジションの最大ロットにそのような小さな制限を 設定することはできません。