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

 
Alexey Viktorov:

再コンパイルしたからではなく、テストの開始時期が違うからです。そして、このバグに気づいたのですが、すでにあるものを入れると、テストが行われず、すぐに前のテスト結果が出るのです。だから、そんなまやかしに騙されないでください。普通にしてみてください。もし、何かが欠けていたり、パラメータが無効な場合は、Printで報告していただければ、すべて正しくなります。

もし、日付が違うことだけが原因なら、私のチェックで判明するのですが(バーの欠落など)、問題は日付ではないのです。自動検証で見つかったエラーを再構築できないのであれば、同じように滑らせて、バイヤーによる復讐で問題箇所(があれば)を見つけてくれることを期待する方が簡単です。このバリデーションの実装では、どこにエラーがあるのか完全に理解することはできません。そして、Printは もう私の場合、あちこちに押し込まれています。

Alexey Viktorov:

そして、私はそのようなシャグに気づいた、私はすでにあったことを貼り付ける場合は、テストが発生せず、すぐに以前のテスト結果を与える。

そして、以前のテスト結果を得るために、私は何かを変更し、空の文字列を追加する必要があります(私は「再コンパイル」を意味します)。

 
Roman Gergert:

私は最終的にそれを考え出した、多分誰かが助けることができる、一般的に、ソ連はMMが有効になっていたときにのみ最小ロットをチェックしているので、筋金入りのセットロット= 0.01、よく、バリデータの預金がそれぞれ$ 1(トピックの一つにこの情報を発見)、であると判明、それは取引するロット0.001(またはそう)を使用して、私はいつも一箇所に持っていたので、彼はそのため十分ではないお金とロボット取引しませんでした(0.01たくさんだった)

その通り、ローマン、バリデーターは1ドルのデポジットでテストしているんだ。

EAには、多くの正規化機能があります。0を返した場合、取引は開始されません。

      if((Auto() && (b==0 || (b>0 && BuyPriceMin-Ask>(b==1?iPointOrderStep_1:iPointOrderStep_2)*Point()))) || buy) {
         BuyLot=buy && LotFromPanel()>0 ? LotFromPanel() : BuyLot;
         double norm_lot=NormalizeLots(_Symbol,BuyLot);
         if(norm_lot>0.0) {  
            int ticket=OrderSend(Symbol(),OP_BUY,norm_lot,NormalizeDouble(Ask,_Digits),30,0,0,
                        "NZT-48",iMagicNumber,0,clrGreen);
            if(ticket>0) {
                ObjectSetInteger(0,"V_5_buy",OBJPROP_STATE,false);
                buy=false;
            }
            else  
               Print("Order Send error #",GetLastError());
         } else Print("Not enough money for the minimum lot");   
      }

しかし、このEAのロット正規化機能がどのようにして0.2ロットをオープンに送るのか、それじゃあよくわからないですよね。

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
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()*0.95;
   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;
   return(_lot);
}

結局、ロット0.2がチェックに入り、過去ログから判断したマージンが645であれば、この式の部分は真と なるはずです。

if(is_margin && _lot*margin>free)  _lot=0.0;     //0.2*645>0.95

そして、この関数は0.0を送りますが、0.2は送りません。の場合のみ、0.2 を送信することができます。

MarketInfo(symbol,MODE_MARGINREQUIRED);

は0または無視できる値を返した。このバリデーターの仕組みが全く理解できない。

MQL開発者の 皆様、3行のドライな検証エラーレポートではなく、テストログをお送りください。私たち謙虚なプログラマーは、コードの誤りを理解し、それを修正することがはるかに容易になります。電子メールにアーカイブとして送ってもよい、きっと方法を考えるはずです)))

P.S. 面白い状況ですね。5日目は、テスターと実運用で完璧に動作するExpert Advisorを市場に出そうとしているところです。
 
Andrey Kaunov:

その通り、ローマン、バリデーターは1ドルのデポジットでテストします。

EAには、多くの正規化機能があります。0を返した場合、取引は開始されません。

しかし、このEAのロット正規化機能がどのようにして0.2ロットをオープンに送るのか、それじゃあよくわからないですよね。

結局、ロット0.2がチェックに入り、過去ログから判断したマージンが645であれば、この式の部分は真と なるはずです。

そして、この関数は0.0を送りますが、0.2は送りません。の場合のみ、0.2 を送信することができます。

は0または無視できる値を返した。このバリデーターの仕組みが全く理解できない。

MQL開発者の 皆様、3行のドライな検証エラーレポートではなく、テストログをお送りください。私たち謙虚なプログラマーは、コードの誤りを理解し、それを修正することがはるかに容易になります。電子メールにアーカイブとして送ってもよい、方法を考えるかもしれません :)))

P.S. 面白い状況ですね。5日目は、テスターと実運用で完璧に動作するExpert Advisorを市場に出そうとしているところです。

レバレッジが1:500のような気がします。

ロット計算を1k100にするために、コードを1行だけ変更してみてください。

margin= AccountLeverage()*MarketInfo(symbol,MODE_MARGINREQUIRED)/100.0;

で、マーケットの最小ロットは0.1だと思うのですが......。
 

何か限られた自分の世界の中で生きているんですね。通常の世界では、最小ロットは0.01と大きく異なることがあります

RECIPEPTION: 「どのようなチェックを通過しなければならないか・・・」の記事を読み、もう一度読んでください。

取引注文を 出す前に、それが通るかどうか、十分なマージンがあるかどうかを確認する必要があります ...


一般に、バリデータはこれまでのところ、マーケットプレイスから不完全なコードをふるいにかけるという主な仕事をこなしています。

 
Renat Akhtyamov:

市場とは異なるレバレッジを設定しているように見えますが、おそらく1:500です。

ロット計算を1k100のレバレッジにするために、コードを1行だけ変更してみてください。

margin= AccountLeverage()*MarketInfo(symbol,MODE_MARGINREQUIRED)/100.0;

Renatさん、アドバイスありがとうございます、試してみます。

ウラジミール・カルプトフ

あなたは、何か限られた自分の世界の中で生きているのです。通常の世界では、最小ロットは0.01と大きく異なることがあります。

RECIPEPTION: 「どのようなチェックを通過しなければならないか・・・」の記事を読み、もう一度読んでください。

取引注文を 出す前に、それが通るかどうか、十分なマージンがあるかどうかを確認する必要があります ...


一般に、バリデータはこれまでのところ、その主な仕事であるマーケットから不完全なコードをふるいにかけることに対処してきました。

ウラジミール、質問を建設的に理解できるか!マージンなどのロットチェックはしないのですか?どんなチェックを通さなければならないか・・・」という記事は、もう私にとってバイブルのような ものです。上にコードスニペットを掲載しました。完全準拠のため、記事中の推奨事項に従ってコードを変更しました。

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, int direction, 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()*0.95;
   //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;
   ResetLastError();
   if(is_margin && (AccountFreeMarginCheck(Symbol(),direction,_lot)<=0 || GetLastError()==134)) _lot=0.0;
   return(_lot);
}

でも、まだ「ノートレード」と表示されるんです。

もし、この関数が常に0.0ロットを送信して、取引を開始できないのであれば、最小ロットを送信するように変更します。

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, int direction, 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()*0.95;
   //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;
   ResetLastError();
   if(is_margin && (AccountFreeMarginCheck(Symbol(),direction,_lot)<=0 || GetLastError()==134)) _lot=min;
   return(_lot);
}

そして、トレードが発生した履歴が表示されます(以下のスクリーンショットを参照)。しかし、最低限のロットはもちろん、とても不思議なことにやってくるのですが、それはそれとして。でも、お買い得品はありますよ

それは、このような状況では、非常に奇妙なことは、$ 1の預金のための最小ロット0.2を作る、バリデータです。


当然、お買い得感は皆無でしょうし かも、これは完全に適切なコードで。ちなみに、テストのためにインジケータなどの条件はすべて外しています。EAを起動すると同時に取引が開始されます。

ウラジミール・カルプトフ

...

これまでのところ、バリデータはその主な仕事である、マーケットから不完全なコードを選別することに対処してきました。

では、バリデーターは何を処理するのでしょうか?プログラマーの脳みそを吹き飛ばすしかないのか!

なお、Validatorの何かを変えろとは言っていない。単純にテストログを見ればいいんです。そうすれば、どのようなパラメータでテストが行われているのか、またどのような堆積物があるのかを理解することができます。結局のところ、少なくともプリントを使って、コードのどこにエラーがあるのかを確認し、できるだけ早く修正することができるかもしれません。私たちは、1週間ずっと空に向かって指を指して、エラーを特定することだけを試みているわけではありません。私たちは互いに敵対しているわけではないのですね。わかるよ、一緒に何かを稼ごうとしているんだから。

 
Andrey Kaunov:

...別に敵対しているわけではありませんよ!わかるよ、一緒に何かを稼ごうとしてるんだから。

アンドリュー 週末に一度、サーバーのフリーズに遭遇したんだ。

ということは、MarketInfo(...)を食べないだけなのです。

やっとの思いで使えるようになったんです。

だから、あなたが市場を飲み込むことができないことを理解した場合、それが誓うしないバリデータを作成する方法を考えるために残っている

例えば、「レバレッジとは?

0と書いてある。

コードに追加する - 0なら100と表示される

ロジックが明確であれば、うまくいくでしょうし、頑張ってください。

 

なるほど、レナートさん、ありがとうございます。

すでにたくさんの松葉杖を作りましたが、行き詰まったところもあります。そして、十分なコードは十分なテストをしてほしい。それに、テストログがない状態で問題を発見することは不可能ではありませんが、非常に手間がかかります。

おそらくバリデーターも同様にバージョンアップしてもらえると嬉しいですね。このような問題に遭遇するのは、私だけではないだろう。

 
Andrey Kaunov:

なるほど、レナートさん、ありがとうございます。

すでにたくさんの松葉杖を作りましたが、行き詰まったところもあります。そして、十分なコードは十分なテストをしてほしい。それに、テストログがない状態で問題を発見することは不可能ではありませんが、非常に手間がかかります。

おそらくバリデーターも同様にバージョンアップしてもらえると嬉しいですね。このような問題に遭遇するのは、私だけではないだろう。

そうです、この問題に直面しているのはあなただけではありません、次のスレッドではこの問題に直面している別の人がいます、あなたはすでに2人です。

また、毎日どれだけのEAが問題なく市場に投入されているかを見てください。"プロのレベル "と呼ばれるものです。

 

Vitalyさん、もしあなたや他の「プロ」がバリデーションを一回でパスできたら、私はただただ拍手するのみです。しかし、同じような問題で2つ以上のスレッドがあるのは、はるかに多い。それに、誰もが書くわけではなく、読むだけの人もいます。ちなみに、Expert Advisorは私のものではありません。クライアントのためにマーケットで仕込みます。しかし、だからといって、上記のような問題を否定することはできません。私の投稿をよく読んでいただければ、もしかしたら「プロ」として問題解決策を提案できるかもしれません。あなたは馬鹿で、私は賢い」という内容の投稿を出すのは、それほど知識がなくてもできる。

ここでまた問題が発生しましたね。OnTick()の最初に、最小ロットで5分間に5回の取引を無条件で 連続して開始することを追加したところ、バリデータでも「取引操作が ありません」というメッセージが表示されるのはなぜですか?

void OnTick() { 
   static int test_ticket[2]={0,0};
   if(test_ticket[1]<5 && test_ticket[0]==0) {
      test_ticket[0]=OrderSend(_Symbol,OP_BUY,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),NormalizeDouble(Ask,_Digits),30,0.0,0.0,"NZT-48_test",33333,0,clrNONE);
      if(test_ticket[0]>0) test_ticket[1]++;
   }   
   if(OrderSelect(test_ticket[0],SELECT_BY_TICKET))
      if(OrderCloseTime()==0 && OrderOpenTime()+300<TimeCurrent())
         if(OrderClose(test_ticket[0],NormalizeDouble(OrderLots(),2),NormalizeDouble(Bid,_Digits),30,clrNONE)) {
            printf("Test order closed, ticket #%d",test_ticket[0]);
            test_ticket[0]=0;
         }   
...
}
 
Andrey Kaunov:

Vitalyさん、もしあなたや他の「プロ」がバリデーションを一回でパスできたら、私はただただ拍手するのみです。しかし、同じような問題で2つ以上のスレッドがあるのは、はるかに多い。それに、誰もが書くわけではなく、読むだけの人もいます。ちなみに、Expert Advisorは私のものではありません。クライアントのためにマーケットで仕込みます。しかし、だからといって、上記のような問題を否定することはできません。私の投稿をよく読んでいただければ、もしかしたら「プロ」として問題解決策を提案できるかもしれません。あなたは馬鹿で、私は賢い」という内容の投稿を出すのは、それほど知識がなくてもできる。

ここでまた問題が発生しましたね。OnTick()の最初に、最小ロットで5分間に5回の取引を無条件に 開始することを追加したのに、なぜバリデータは「取引操作が ありません」と表示するのですか?

そして、まずバリデータの全レスポンスをここに掲載する必要があります。

そして、バリデーターがあなたの発明した原理でチケットをセットしていると、なぜ思うのですか?

を5回開くには、発券ではなく、オープントレードの回数を数える必要があります。