стати, раз уж этот разговор возник, как автоматически определить, сколько знаков оставлять для цены при помощи NormalizeDouble, то есть, 4 для EURUSD, 2 для EURJPY... ?
int _Digits = MarketInfo( Symbol(), MODE_DIGITS );
именно так. я поэтому и говорил про гипотетическую функцию GlobalVariableSetOnCondition, которая могла бы устанавливать глобальную переменную первым параметром при условии, что значение её равно значению второго параметра. так как доступ к глобальным переменным блокируется, то это даст "атомарность"
さらなる指導を希望する。
クオーク
while(!IsStopped()) { if(GlobalVariableGet(strTradeSemaphore) == 0.0) { GlobalVariableSet(strTradeSemaphore, 1.0); bSemaphored = true; break; } Sleep(1000); }です。GlobalVariableGet(strTradeSemaphore) == 0.0) とGlobalVariableSet(strTradeSemaphore, 1.0) の間で、別のEAがカットインすることを認めます。実行スレッドを捕捉して抑制し(つまりリソースを待ち)、Expert Advisor に制御を戻す関数が必要です。WaitForExclusive()のようなもの . もっとも、ポイントはそこではないかもしれませんが。しかし、残念なことにエラーが出続けている。
何か役に立てればと思います。
ところで、この会話が始まったところで、NormalizeDoubleで 価格を何桁残すか、つまりEURUSDなら4桁、EURJPYなら2桁...と自動的に判断するにはどうしたらいいのでしょう??
double dStopLoss; int nHoursToHold; datetime timePrev = 0; int nSlip = 5; double dLotSize = 0.1; int nMagic = 0; int nDigits = 4; string strTradeSemaphore = "TradeSemaphore"; ////////////////// int init () { if(!GlobalVariableCheck(strTradeSemaphore)) GlobalVariableSet(strTradeSemaphore, 0.0); dStopLoss = 110 * Point; nHoursToHold = 1; if(Symbol() == "EURUSD") nMagic = 1; else if(Symbol() == "EURJPY") { nMagic = 2; nDigits = 2; } else if(Symbol() == "USDCHF") nMagic = 3; else if(Symbol() == "GBPUSD") nMagic = 4; else if(Symbol() == "GBPJPY") { nMagic = 5; nDigits = 2; } else if(Symbol() == "GBPCHF") nMagic = 6; else if(Symbol() == "USDJPY") { nMagic = 7; nDigits = 2; } 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; if(!bIsBarEnd) return(0); // ------ int nSignal = GetSignal(); 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); } } } if(nSignal == OP_BUY) Buy(); else if(nSignal == OP_SELL) Sell(); GlobalVariableSet(strTradeSemaphore, 0.0); return(0); } // ------ void Sell() { if(AccountFreeMargin() < 500) return; dLotSize = GetLotSize(); int nResult = OrderSend(Symbol(), OP_SELL, dLotSize, NormalizeDouble(Bid, nDigits), nSlip, NormalizeDouble(Bid + dStopLoss, nDigits), 0, "Friday", nMagic, 0, OrangeRed); if(nResult == -1) { int nError = GetLastError(); Alert(Symbol() + ", sell: " + NormalizeDouble(Bid, nDigits) + ", Stop: " + NormalizeDouble(Bid + dStopLoss, nDigits) + ", error: " + nError); } } // ------ void Buy() { if(AccountFreeMargin() < 500) return; dLotSize = GetLotSize(); int nResult = OrderSend(Symbol(), OP_BUY, dLotSize, NormalizeDouble(Ask, nDigits), nSlip, NormalizeDouble(Ask - dStopLoss, nDigits), 0, "Friday", nMagic, 0, Aqua); if(nResult == -1) { int nError = GetLastError(); Alert(Symbol() + ", buy: " + NormalizeDouble(Ask, nDigits) + ", Stop: " + NormalizeDouble(Ask - dStopLoss, nDigits) + ", 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); }138エラー です。1分間に数回(つまり、12個のExpert Advisorのうち数個が生成する)。
129エラーです。価格の配分をしたり、いろいろやっていたのですが......。
というエラーが出て、5を使ったExpert Advisorでは、6というエラーが出ました。
Expert Advisor が私の修正で動作しない。)
然う然う私の5もうまくいきません =))) さあ、どうする。
と、私の5を使ったExpert Advisorは、1つのエラー - 6を与えました。
Expert Advisor が私の修正で動作しない。)
然う然う私の5も動きません =))) やばいです。
コードをありがとうございます。自分で探すと時間がかかってしまうので。
Slavaが提案し、私が改良した専門家を以下に紹介します。私のように、12のウィンドウ、12の通貨で実行することができます。どの時間軸でも使えますが、分単位の方が速いです)。エラーが出続けるんだよ、クソが。 その理由がわかればいいのですが。
double dStopLoss; int nHoursToHold; datetime timePrev = 0; int nSlip = 50; double dLotSize = 0.1; int nMagic = 0; int nDigits; string strTradeSemaphore = "TradeSemaphore"; ////////////////// int init () { if(!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; if(!bIsBarEnd) return(0); // ------ 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); } } } Sleep(500); int nSignal = GetSignal(); if(nSignal == OP_BUY) Buy(); else if(nSignal == OP_SELL) Sell(); Sleep(500); GlobalVariableSet(strTradeSemaphore, 0.0); return(0); } // ------ void Sell() { if(AccountFreeMargin() < 500) return; dLotSize = GetLotSize(); double dNormalizer = MathPow(10, nDigits); double dBid = MathFloor(Bid * dNormalizer) / dNormalizer; //NormalizeDouble(Bid, nDigits); double dStop = 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 = MathFloor(Ask * dNormalizer) / dNormalizer; //NormalizeDouble(Bid, nDigits); double dStop = 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); }. もっとも、ポイントはそこではないかもしれませんが。しかし、残念なことに、エラーが出続けている。
。
グローバル変数への アクセスがブロックされるため、「原子性」を与えることになる さて、関数IsStoppedについて。これは、EAが正常に停止できるように、停止フラグをチェックする(このために2.5秒ある)。この関数をループ条件の1つ、特に無限ループに使うことが推奨される。
スラバ、どうしてもこの文章が理解できないんだ。他の言葉で説明するか、見せてください。できれば
ところで、私が書き直したコードのどこがおかしいのでしょうか?というか、動かないから何かがおかしいのは明らかなんだけど、エラーが出ないんだよなぁ。私の勘では、これで独占的にアクセスできたはずなのですが......。
while(!IsStopped()) { if(GlobalVariableGet(strTradeSemaphore) == 0.0) GlobalVariableSet(strTradeSemaphore, nMagic); if(GlobalVariableGet(strTradeSemaphore) == nMagic) break; Sleep(1000); }; { if(GlobalVariableGet(strTradeSemaphore) == nMagic) break; Sleep(1000); }; { if(GlobalVariableGet(strDrive) == nMagic)именно так. я поэтому и говорил про гипотетическую функцию GlobalVariableSetOnCondition, которая могла бы устанавливать глобальную переменную первым параметром при условии, что значение её равно значению второго параметра. так как доступ к глобальным переменным блокируется, то это даст "атомарность"
スラバ、どうしてもこの文章が理解できないんだ。他の言葉で説明するか、意味を示してください。できれば、 。
GlobalVariableGet と GlobalVariableSet関数の 呼び出しの間のウェッジングの可能性を防ぐことについて話しています。別の Expert Advisor によるウェッジングは、エラーがまだ観察されるので、現実です。これが、私が原子アクセスについて話している理由です。あなたと私は、同じ問題を解決しようとしていますが、異なる言葉で話しています。 .
ところで、私が手直ししたコードの一部には、何か問題があるのでしょうか?というか、動かないので何かがおかしいのは明らかなのですが、エラーが表示されないのです。私の勘では、これで独占的にアクセスできたはずなのですが......。
while(!IsStopped()) { if(GlobalVariableGet(strTradeSemaphore) == 0.0) GlobalVariableSet(strTradeSemaphore, nMagic); if(GlobalVariableGet(strTradeSemaphore) == nMagic) break; Sleep(1000); }; { if(GlobalVariableGet(strTradeSemaphore) == nMagic) break; Sleep(1000); }; { if(GlobalVariableGet(strDrive) == nMagic)あなたの例の方が良い