解剖の結果、エラーコード139の使い方が間違っていることが判明しました。実際は「取引コンテキストがビジー状態」であり、何らかの理由で特別なコードが設定されていませんでした。同様の問題は、本日英語フォーラム「Trade Dispatcher: all trade context is busy」で議論されました。 すべてのEAに1つの取引コンテキストしかありません。正しい解決策は、グローバル変数にセマフォの独自のシステムを構築することです。 4つのEAを4分間に走らせたが、10分間に139のエラーが7回発生した。
解剖の結果、エラーコード139の誤用が判明しました。実際は「trade context is busy」であり、なぜか特別なコードはありません。"Trade Dispatcher: all trade context is busy" すべてのEAに1つの取引コンテキストしかありません。正しい解決策は、グローバル変数に独自のセマフォシステムを構築することです。 4つのEAを10分間に7回エラー139回で動かしています。
さて、この事件のロジックについて。おせっかいで申し訳ないんですが...私が正しく理解していれば、セマフォを何とか設定するまで、whileループに座っていることになります。そうだろ?そして、私たち以外誰も取引していないことを知りながら、取引をする。そして、セマフォを元の状態に戻す。質問:while(!IsStopped())はどのように動作するのですか??Allow Live Tradingのチェックかと思った。質問:それらのwhileやsleepは、システムにラグを発生させないのでしょうか?質問:
すべてのEAに1つの取引コンテキストしかありません。正しい解決策は、グローバル変数にセマフォの独自のシステムを構築することです。
4つのEAを4分間に走らせたが、10分間に139のエラーが7回発生した。
すべてのEAに1つの取引コンテキストしかありません。正しい解決策は、グローバル変数に独自のセマフォシステムを構築することです。
4つのEAを10分間に7回エラー139回で動かしています。
このセマフォのシステムはどうあるべきか、少なくとも一般論として教えていただけませんか?
1.特に、他の人の邪魔にならないように、どのように取引を行うべきか。
2.スリップ、チェック、タイムアウト(マルチスレッドMTでは無いと約束されていたのに、さぁ)
そして最後に。これを叱咤激励と受け取らないでください。教科書があるじゃないですか。その中で、専門家の意見が述べられています。そこにあるセマフォを見せてください。
これが私の専門家です。20ルーブルのパンツのようにシンプルです。1時間ごとにポジションを反転させる。もしあなたが本当にトレーダーやブローカーの利益のことを考えるなら(私は人のことはわかりませんが、まず安定して動くEAを手に入れ、それからデモからリアルに切り替えたいと思っています)、私のこのEAの例で、どうすれば正しいのかを示してください。
敬具
クオーク
追伸:時々現れるエラー2、6、138、4109の起源については、まだ未解決です。
英文スレッドを読ませていただきました。ああ...この人たちは、緊急にロシア語を勉強する必要があります。
似ているのではなく、同じ問題なのです。確かに、エラー2、6、138、4109はまだ出てないですね。139の話だけだった。
正直、IsTradeAllowedの意味がわからない。スラバ氏自身が、10個のExpert Advisorにこの機能を使わせて、突然取引を開始すると、最初の1個を除く全員がダメになることを説明しました。
それよりも、リクエストをキューに溜め、しばらく放置し、実行されるか削除されるようにする方がずっと良いだろう。でも、これは全部夢なんです。
そうではなく、例えばグローバル変数 nTrading を作成し、そこに Expert Advisor の名前を格納する必要があります。また、他のEAはどうすればいいのでしょうか?保留中の注文を持つMT3に戻るそれとも、他のアイデアがあるのでしょうか?
ちなみに、グローバル変数がなくても、次のようなことは可能です。
ここで、Buy() と Sell() は、失敗すると OP_BUY / OP_SELL を、成功すると -1 を返します。
デメリットは明らかで、ブローカーは1つの注文ではなく、10個のオープン(クローズ)注文を受け取ることになる。自動であれば、すべて問題ありません。もし、それが人間であれば-怒られるでしょう。さらに悪いことに、オートマトンと人間が異なる論理に従って行動している場合。例えば、オートマトンには待ち行列がない(スラバが説明してくれたように、1つのスレッドで、待ち行列を形成する代わりに命令が競合する)し、人間にはある。そして、そのトレーダーは本番で取引を始めますが、その理由すら理解できません。なぜなら、彼は(私 - アルパリのセミナーでのプレゼンテーションで)デモと本番には違いがないと断言されたからです。
2つ目のオプションは、エキスパートと通貨にそれぞれ独自のMnを割り当て、エキスパートアドバイザーと通貨の組み合わせが一意になるようにします。そして、バーが開いてから1秒後にIM1のEAが、7秒後にIM7のEAが取引されるようにコードを記述します。これにより、システムは1秒間の取引を行うことができます。
Slavaに質問 - 問題を回避するには、2番目でいいのでしょうか?
デメリットは明白で、スキャルパー - ピプサーはそれらについて教えてくれるでしょう :)
開発者の皆様へ(all-all)。分かりやすい説明ありがとうございます。この記事と過去の記事には、まだ未解決の部分があります。答えを待っている。
クオーク
//+------------------------------------------------------------------+ //| TestQuark.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" double dStopLoss; int nHoursToHold; datetime timePrev = 0; int nSlip = 5; double dLotSize = 0.1; int nMagic = 0; string SemaphoreName="TradeSemaphore"; ////////////////// int init () { if(!GlobalVariableCheck(SemaphoreName)) GlobalVariableSet(SemaphoreName,0.0); timePrev = 0; dStopLoss = 110 * Point; nHoursToHold = 1; if(Symbol() == "EURUSD") nMagic = 1; else if(Symbol() == "EURJPY") nMagic = 2; else if(Symbol() == "USDCHF") nMagic = 3; else if(Symbol() == "GBPUSD") nMagic = 4; else if(Symbol() == "GBPJPY") nMagic = 5; else if(Symbol() == "GBPCHF") nMagic = 6; else if(Symbol() == "USDJPY") nMagic = 7; else if(Symbol() == "AUDUSD") nMagic = 8; else if(Symbol() == "EURGBP") nMagic = 9; else if(Symbol() == "USDCAD") nMagic = 10; else if(Symbol() == "EURCHF") nMagic = 11; else if(Symbol() == "EURAUD") nMagic = 12; timePrev += nMagic; // Open nMagic seconds after the new bar return(0); } // ------ int deinit() { return(0); } // ------ int start() { if(Bars < 5) return(0); // The previous bar just closed bool bIsBarEnd = false; if(timePrev != Time[0] + nMagic) bIsBarEnd = true; timePrev = Time[0] + nMagic; if(!bIsBarEnd) return(0); // ------ int nSignal = GetSignal(); bool bSemaphored=false; while(!IsStopped()) { if(GlobalVariableGet(SemaphoreName)==0.0) { GlobalVariableSet(SemaphoreName,1.0); bSemaphored=true; break; } Sleep(1000); } if(nSignal == OP_BUY) Buy(); else if(nSignal == OP_SELL) Sell(); for(int nCnt = OrdersTotal() - 1; nCnt >= 0; nCnt--) { OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES); if(OrderMagicNumber() == nMagic) { if(CurTime() - OrderOpenTime() > (nHoursToHold - 1) * 60 * 60) { if(OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua); else if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed); } } } if(bSemaphored) GlobalVariableSet(SemaphoreName,0.0); return(0); } // ------ void Sell() { if(AccountFreeMargin() < 500) return; dLotSize = GetLotSize(); int nResult = OrderSend(Symbol(), OP_SELL, dLotSize, Bid, nSlip, Bid + dStopLoss, 0, "Friday", nMagic, 0, OrangeRed); if(nResult == -1) { int nError = GetLastError(); Alert(Symbol() + ", " + nError); } } // ------ void Buy() { if(AccountFreeMargin() < 500) return; dLotSize = GetLotSize(); int nResult = OrderSend(Symbol(), OP_BUY, dLotSize, Ask, nSlip, Ask - dStopLoss, 0, "Friday", nMagic, 0, Aqua); if(nResult == -1) { int nError = GetLastError(); Alert(Symbol() + ", " + nError); } } // ------ double GetLotSize() { double dLot = 0.1; return(dLot); } // ------ int GetSignal() { int nSignal; if(MathMod(Hour(), 2) == 0) nSignal = OP_BUY; else nSignal = OP_SELL; return(nSignal); } //+------------------------------------------------------------------+グローバル変数 がある値を持っている場合に、その値を設定 する関数を作る場合、 のような構成はありません。
if(GlobalVariableGet(SemaphoreName)==0.0) { GlobalVariableSet(SemaphoreName,1.0); bSemaphored=true; break; }.であれば、100%信頼できる のようなものです。
if(GlobalVariableSetOnCondition(SemaphoreName,1.0,0)==true) { bSemaphored=true; break; } { bSemaphored=true?いいえ、停止はサーバーで実行されます。
また、キューについてですが、ファイルに書かれた 注文を実行するEAを作ろうと思いつきました。そして、他のすべての専門家は、このファイルに命令を書き込むだけです。
でも、私にとっては(有能なインプリメンテーションという意味で)とても簡単なことではないのです......。でも、やってみることは可能です。共通の努力で =))
これは私が理解できなかった一節です:
if(GlobalVariableGet(SemaphoreName)==0.0)
{
GlobalVariableSet(SemaphoreName,1.0);
bSemaphored=true;
break;
}
さて、この事件のロジックについて。おせっかいで申し訳ないんですが...私が正しく理解していれば、セマフォを何とか設定するまで、whileループに座っていることになります。そうだろ?そして、私たち以外誰も取引していないことを知りながら、取引をする。そして、セマフォを元の状態に戻す。質問:while(!IsStopped())はどのように動作するのですか??Allow Live Tradingのチェックかと思った。質問:それらのwhileやsleepは、システムにラグを発生させないのでしょうか?質問:
テスト モードでSleepやセマフォは正しく処理されますか?もうひとつ、論理的な質問をします。セマフォの設定と削除の間に、命令を処理するための2つの(最大)可能性があります。まずBuy()またはSell()、そしてその下にCloseOrder()があります。EA内部ではありますが、この2つの「活動」は、あたかも2つのExpert Advisorがあるかのように競合しないのでしょうか?それとも、処理は線形であることが保証されており、Buy()が戻るまでCloseOrder()に到達しないのでしょうか?よろしくお願いします。クオーク
ストップはサーバーで処理されます。また、当社の場合、お客様の専門的な取引フローに競争があります。
言い間違えました。ShouldOrderSend(OP_BUYSTOP...また、セマフォの設定と削除を行うコードで囲むのですか?バカな質問ですね。もちろん、そうすべきです。
トレード機能を再構築し(ライブラリを接続)、別のeuram - m15に取り付けました。メイジッチはもちろん、変化しています。
どうなったかはまたお知らせします;)