取引ロボットをマーケットにリリースする際のバリデーションエラー。 - ページ 5

 
ありがとうございます。でも、たぶん私の場合は違います。私のバリデーターは取引機能を全く見ず、最大注文 数に到達する方法がありません )))
 

ああ、シャイターン...。バリデーションに合格し、現在

無手数料営業

はエラーにならなくなりました。

P.S. 適当に撮ったものです。次のテストはまた同じことをする


 
Andrey Kaunov:

ここにエラーはない、全く理解できない。トレード機能の前に松葉づえ(ゼロによる除算)を置いてみた。

効くんです。

取り出すと、同じものが出てくる。

トレーディング業務は行っていない。

バリデーターがOrderSend()を妨げる要因がわからない。結局、彼に届けば、課金エラー(全部直したけど)130、131、134、・・・があるはずで、「取引操作なし」はないのです。OnInit()でどこか遠くに保留注文を入れてトリガーされないようにするだけなんだけどね。

そして、取引が行われる条件がコードに入らないのであれば、このような松葉杖に何の意味があるのでしょうか。

 
どうして入ってこないんだ!?よく見て、アレクセイ。OrderSendの 直前には、松葉杖があります。
 
Andrey Kaunov:
なぜ入力がないんだ!よく見てください、アレクセイ。OrderSendの直前に松葉杖があります。

そうですね。OrderSend が実行されない場合、何らかの理由でコード実行が到達しないことを意味する。そして、条件ブロックの前に何を置いても、入力もなければ実行もされず、ゼロによる除算さえも できない。

 

待てよ、よくわからない。演算子1(0による除算)が実行されたら、次はif演算子です。そしてそれは、その状態を確認することでもあります。条件を確認するためには、OrderSend関数を実行する必要があり、ゼロによる除算の次に実行されることになります。

でも、気にしないでください。実験の純度を高めるために、コードを変更しました。


結果は同じです。松葉杖を使用した場合の結果は、0による除算のエラーとなります。 松葉杖を使用しない場合の結果は、上記のように、取引操作なし となります。

 
Andrey Kaunov:

待てよ、よくわからない。演算子1(0による除算)が実行されたら、次はif演算子です。そしてそれは、その状態を確認することでもあります。条件を確認するためには、OrderSend関数を実行する必要があり、ゼロによる除算の次に実行されることになる。

でも、気にしないでください。実験の純度を高めるために、コードを変更しました。


結果は同じです。松葉杖を使用した場合の結果は、0による除算のエラーです。 松葉杖を使用しない場合の結果は、上記の通りです:取引操作 なし。

コードの貼り付けに画像を使ってはいけませんでした。まったく読めません。そして、問題はこのコード断片にあるのではありません。問題は、ある入力パラメータで何らかの条件が満たされず、通知がないことである。

 
Andrey Kaunov:
なんで入らないんだ!?

なんで自分のためより市場のために悪いことを書こうとするんだ?

簡単なことです。注文を送る前に、"それが実行可能かどうか "を確認するのです。

限度額を確認し(あなたはそう言った)、資金と 証拠金を確認し(あなたはそれを持っていない)、リンクがあるかどうか、その取引が許可されているかどうかを確認します。

(オプション) 重い計算があった場合、Bid Askを読む前にRefreshRatesするのは罪ではない。

自分のために、これらのチェックをすべて行うのです。なぜ今ではないのか?

 

私がチェックしないと思っているのか。ロットサイズの確認は別機能で行います

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, bool is_margin=true) {
   if(lot<=0) return(0.0);
   RefreshRates();
   double min=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double max=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP); 
   double free = AccountFreeMargin();
   double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot=MathRound(_lot/step)*step;
   if(is_margin && _lot*margin>free)  _lot=0.0; //MathFloor(free/margin/step)*step;
   return(_lot);
}

ストップロスとテイクプロフィットは取引開始時にゼロに等しいので、ここではリミットは必要ありません。RefreshRates() はロット計算時にデータを更新 します。もちろん、各入力前の接続等のチェックはありませんが、そこは問題ではありません。OrderSend がリクエストを送信した場合、130、131 などの特定のエラーが発生します。しかし、私が持っているのは

オープンに向けて注文を送ろうとしているわけでは全くありません。最後のテストでも、OnInit()関数で チェックポジションを設定すると

int OnInit() {
  
   int stops_level=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
   iTrailStart=inpTrailStart;
   iTrailStart2=inpTrailStart2;
   iTrailStartL=inpTrailStartL;
   //---
   if(stops_level>0) {
      if(inpTrailStart<stops_level+3) iTrailStart=stops_level+3;
      if(inpTrailStart2<stops_level+3) iTrailStart2=stops_level+3;
      if(inpTrailStartL<stops_level+3) iTrailStartL=stops_level+3;
   }
   
   Comment("");
   EventSetMillisecondTimer(300);
   ButtonCreate("V_5",5,25,50,20,"FLAT",9,clrBlack,C'236,233,235', clrNONE,false);
   ButtonCreate("V_7",60,25,50,20,"TREND",9,clrBlack,C'236,233,235', clrNONE,false);
   ButtonCreate("Auto",115,25,50,20,"Auto",9,clrBlack,C'236,233,235',clrNONE,false);
   ObjectCreate(0,"Lot",OBJ_EDIT,0,0,0);
   ObjectSetInteger(0,"Lot",OBJPROP_CORNER,CORNER_LEFT_LOWER);
   ObjectSetInteger(0,"Lot",OBJPROP_XDISTANCE,115);
   ObjectSetInteger(0,"Lot",OBJPROP_YDISTANCE,50);
   ObjectSetString(0,"Lot",OBJPROP_TEXT,"");
   ObjectSetInteger(0,"Lot",OBJPROP_ALIGN,ALIGN_RIGHT);
   ObjectSetInteger(0,"Lot",OBJPROP_FONTSIZE,9);
   ObjectSetInteger(0,"Lot",OBJPROP_COLOR,clrBlack);
   ObjectSetInteger(0,"Lot",OBJPROP_YSIZE,20);
   ButtonCreate("V_5_buy",5,50,50,20,"BUY",9,clrBlack,C'236,233,235', clrNONE,false);
   ButtonCreate("V_5_sell",60,50,50,20,"SELL",9,clrBlack,C'236,233,235', clrNONE,false); 
     
   test_ticket=OrderSend(_Symbol,OP_BUYLIMIT,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),_Point,30,0.0,0.0,"NZT-48_test",iMagicNumber,0,clrNONE);
   
   return(INIT_SUCCEEDED);
}//-------------------------------------- End OnInit ---------------------------------------- 

Alexey Viktorov:

画像にコードを貼り付けるのはやめたほうがいい。読めなくなるのです。問題はこのコード断片にあるのではありません。入力パラメータに何らかの条件が成立せず、その事実が通知されないという問題です。

そうかもしれませんね。でも、もうすべてダブルチェック済みです。次にどこを掘ればいいのかわからない。

 
Andrey Kaunov:

私がチェックしないと思っているのか。ロットサイズの確認は別機能で行います

ストップロスとテイクプロフィットは取引開始時にゼロに等しいので、ここではリミットは必要ありません。RefreshRates() はロット計算時にデータを更新 します。もちろん、各入力前の接続等のチェックはありませんが、そこは問題ではありません。OrderSend がリクエストを送信した場合、130、131 などの特定のエラーが発生します。しかし、私が持っているのは

オープンに向けて注文を送ろうとしているわけでは全くありません。最後のテストでも、OnInit()関数で チェックポジションを設定すると


可能です。でも、もうすべてダブルチェック済みです。次にどこへ行けばいいのかわからない。

他の命令がEAでどのように実装されたかを見てください。Expert Advisorだけが開くということはないと思います。

オープニングでticket<0が設定されている - 他のロジックを見て、実際にこれにどう反応するか

理由: