1.この100件の中には、Expert Advisorに直接関係しない、作業中に発見されたバグもいくつか含まれています。例えば、Expert Advisorは、Allow Live Tradingのチェックボックスを外しても、取引が継続されることに気づきました。忘れないでいてほしい。
2.以下は、私のExpert Advisorのコードをもう一度。エラー1、129、138が発生します。a) 138(requote)とは何か、なぜ起こるのか、セマフォと関係があるのか、そしてどう修正するのか、教えてください。 b) なぜ129なのですか?価格も一緒に印刷されているので、間違いはなさそうです。
あなたの例はもっといいものです。
[/quote]
この例ではうまくいきません。エラーが出る。もっと経験豊富な開発者の方で、うまくいくように助けていただけないでしょうか?
謹んで申し上げます。
クオーク
。
これは、Expert Advisor を外部で終了させるかどうかの確認です。
質問:これらのwhileとSleepは、システムの速度を低下させないのですか? 。
システムが遅くなることはありません。単一のExpert Advisorのみ
質問:テストモードでSleepやセマフォが正しく処理されるか? 。
実際のアクティブなEAがこのセマフォを奪い合うかもしれません。テストでは1つのEAしかテストされないので、セマフォは全く必要ありません - 相互作用するエキスパートの同時テストを組織することはできません。テストでのセマフォ処理を除外するには、関数 IsTesting を使用してください。
また、ロジックに関しても。セマフォの設定と削除の間に、命令を処理するための2つの(最大)可能性があります。まずBuy()またはSell()、そして以下、CloseOrder()となります。この2つの「活動」は、EA内部ではありますが、あたかもExpert Advisorが2つあるかのように競合しないのでしょうか?それとも、処理は線形であることが保証されており、Buy()が戻るまでCloseOrder()に到達しないのでしょうか?
トレードのオペレーションは、エキスパートがトレードのオペレーションが完了するまで待つという同期的なものになったので、これらのアクティビティが互いに競合することはありません。"プロセスは線形であることが保証されている"
GlobalVariableSetOnCondition関数が できるまで数日待てば、アクセス制御の問題はすべて解決する。
GlobalVariableSetOnCondition関数を数日待てば、アクセス区切りの問題はすべて解決します。
もし、MTにGlobalVariableSetOnCondition関 数を導入する予定ということであれば、それについて事前に一言お願いします。この状況でどのように使うことを提案しているのかも含めて?数日 - 週末を含めて?
MTで注文の行列を作ったらどうでしょう。つまり、あるポジションで作業するリクエストを非同期に書き込むと、別スレッドのMTが時間があるときにそのリクエストを処理し、そこに他の人が入ってこないことを保証してくれるのです。
クオーク
このような状況でどのように使うことを提案しているのかを含めて教えてください。
数日 - 週末を含めて?
すでに例を示しましたが
if(GlobalVariableSetOnCondition(SemaphoreName, 1.0, 0.0)==true) { bSemaphored=true; break; }.グローバル 変数の値が0.0であれば、1.0に設定し、trueを返す。念のため、「2、3日後」と言ったが、今日中には掲載できるだろう。
注文の行列を作ることはありません
ただ、それが何であるかは言っていない :)と書き込む機能が提案されたのかと思いました。
念のため「2〜3日」と言ったが、今日中に掲載したい。
ありがとうございます。
1.この100件の中には、Expert Advisorに直接関係しない、作業中に発見されたバグもいくつか含まれています。例えば、Expert Advisorは、Allow Live Tradingのチェックボックスを外しても、取引が継続されることに気づきました。忘れないでいてほしい。
2.以下は、私のExpert Advisorのコードをもう一度。エラー1、129、138が発生します。a) 138(requote)とは何か、なぜ起こるのか、セマフォと関係があるのか、そしてどう修正するのか、教えてください。 b) なぜ129なのですか?価格も一緒に印刷されているので、間違いはなさそうです。
テスト方法を思い出してみましょう。12通貨で12分足です。
敬称略、
Quark
double dStopLoss; int nHoursToHold; datetime timePrev = 0; int nBars; int nDelaySeconds = 3; int nSlip = 50; double dLotSize = 0.1; int nMagic = 0; int nDigits; string strTradeSemaphore = "TradeSemaphore"; ////////////////// int init () { nBars = Bars; if(!IsTesting() && !GlobalVariableCheck(strTradeSemaphore)) GlobalVariableSet(strTradeSemaphore, 0.0); dStopLoss = 110 * Point; nHoursToHold = 1; nDigits = MarketInfo( Symbol(), MODE_DIGITS ); 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; 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; */ bool bIsBarEnd = false; if(nBars != Bars) { if(IsTesting() || (!IsTesting() && CurTime() > Time[0] + nMagic * nDelaySeconds)) { bIsBarEnd = true; nBars = Bars; } } if(!bIsBarEnd) return(0); // ------ if(!IsTesting()) { while(!IsStopped()) { if(GlobalVariableGet(strTradeSemaphore) == 0.0) GlobalVariableSet(strTradeSemaphore, nMagic); if(GlobalVariableGet(strTradeSemaphore) == nMagic) break; Sleep(1000); } } 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); } } } int nSignal = GetSignal(); if(nSignal == OP_BUY) Buy(); else if(nSignal == OP_SELL) Sell(); if(!IsTesting()) GlobalVariableSet(strTradeSemaphore, 0.0); return(0); } // ------ void Sell() { if(AccountFreeMargin() < 500) return; dLotSize = GetLotSize(); double dNormalizer = MathPow(10, nDigits); double dBid = Bid;//MathFloor(Bid * dNormalizer) / dNormalizer; //NormalizeDouble(Bid, nDigits); double dStop = Bid + dStopLoss;//MathFloor((Bid + dStopLoss) * dNormalizer) / dNormalizer; //NormalizeDouble(Bid + dStopLoss, nDigits); int nResult = OrderSend(Symbol(), OP_SELL, dLotSize, dBid, nSlip, dStop, 0, "Friday", nMagic, 0, OrangeRed); if(nResult == -1) { int nError = GetLastError(); Alert(Symbol() + ", sell: " + dBid + ", Stop: " + dStop + ", error: " + nError); } } // ------ void Buy() { if(AccountFreeMargin() < 500) return; dLotSize = GetLotSize(); double dNormalizer = MathPow(10, nDigits); double dAsk = Ask;//MathFloor(Ask * dNormalizer) / dNormalizer; //NormalizeDouble(Bid, nDigits); double dStop = Ask - dStopLoss;//MathFloor((Ask - dStopLoss) * dNormalizer) / dNormalizer; //NormalizeDouble(Bid + dStopLoss, nDigits); int nResult = OrderSend(Symbol(), OP_BUY, dLotSize, dAsk, nSlip, dStop, 0, "Friday", nMagic, 0, Aqua); if(nResult == -1) { int nError = GetLastError(); Alert(Symbol() + ", buy: " + dAsk + ", Stop: " + dStop + ", error: " + 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); }