Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Ich hoffe auf weitere Hinweise.
Quark
while(!IsStopped()) { if(GlobalVariableGet(strTradeSemaphore) == 0.0) { GlobalVariableSet(strTradeSemaphore, 1.0); bSemaphored = true; break; } Sleep(1000); }gibt zu, dass zwischen (GlobalVariableGet(strTradeSemaphore) == 0.0) und GlobalVariableSet(strTradeSemaphore, 1.0); ein anderer EA einspringen wird. Wir benötigen eine Funktion, die den Ausführungsthread erfasst und sperrt (d. h. auf die Ressource wartet) und dann die Kontrolle an den Expert Advisor zurückgibt. So etwas wie WaitForExclusive()
. Aber das ist vielleicht nicht der Punkt. Aber die Fehler tauchen leider immer wieder auf.
Ich hoffe, dass ich Hilfe bekomme.
By the way, jetzt, dass dieses Gespräch begonnen hat, wie kann ich automatisch bestimmen, wie viele Ziffern für Preis mit NormalizeDouble zu verlassen, d.h. 4 für EURUSD, 2 für EURJPY... ?
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); }Fehler 138. Mehrmals pro Minute (d.h. mehrere von 12 Expert Advisors erzeugen ihn).
Fehler 129. Ich habe die Preise rationiert und eine Menge anderer Dinge getan...
und Ihr Expert Advisor mit meinem 5 gab mir einen Fehler - 6.
mein Expert Advisor funktioniert nicht in meiner Korrektur - sie haben es in diesem Build vermasselt =)
Ach ja... mein 5er funktioniert auch nicht =)))) oh man...
und Ihr Expert Advisor mit meinen 5 gab einen Fehler - 6.
mein Expert Advisor funktioniert nicht in meiner Korrektur - sie haben es in diesem Build vermasselt =)
Ach ja... mein 5er funktioniert auch nicht =)))) oh man...
Danke für den Code, ich hätte lange gebraucht, um ihn selbst zu finden.
Der von Slava vorgeschlagene und von mir verbesserte :) Experte ist unten angegeben. Sie können es wie ich machen - in 12 Fenstern, mit 12 Währungen. Es funktioniert für jeden Zeitrahmen, aber bei Minuten geht es schneller). Ich erhalte ständig Fehler, verdammt noch mal. Ich wünschte, ich wüsste warum.
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); }. Aber das ist vielleicht nicht der Punkt. Aber leider tauchen die Fehler immer wieder auf.
das ist genau das, was ich über die hypothetische Funktion GlobalVariableSetOnCondition meinte, die eine globale Variable als ersten Parameter setzen könnte, vorausgesetzt, ihr Wert ist gleich dem Wert des zweiten Parameters. da der Zugriff auf globale Variablen blockiert ist, gibt es "Atomizität"
jetzt über die Funktion IsStopped. sie prüft das Stop-Flag, so dass der EA normalerweise anhalten könnte (er hat 2,5 Sekunden dafür). es wird empfohlen, diese Funktion als eine der Schleifenbedingungen zu verwenden, insbesondere für Endlosschleifen
Slawa, ich verstehe diesen Text beim besten Willen nicht. Bitte erklären Sie es mit anderen Worten oder zeigen Sie mir, was Sie meinen. Wenn Sie können.
Übrigens, was ist falsch an dem Code, den ich umgeschrieben habe? Ich meine, es ist klar, dass etwas nicht stimmt, weil es nicht funktioniert, aber ich sehe den Fehler nicht. Meiner Vermutung nach hätte dies den exklusiven Zugang ermöglichen sollen...
while(!IsStopped()) { if(GlobalVariableGet(strTradeSemaphore) == 0.0) GlobalVariableSet(strTradeSemaphore, nMagic); if(GlobalVariableGet(strTradeSemaphore) == nMagic) break; Sleep(1000); }именно так. я поэтому и говорил про гипотетическую функцию GlobalVariableSetOnCondition, которая могла бы устанавливать глобальную переменную первым параметром при условии, что значение её равно значению второго параметра. так как доступ к глобальным переменным блокируется, то это даст "атомарность"
Slawa, ich verstehe diesen Text beim besten Willen nicht. Erklären Sie es entweder mit anderen Worten, oder zeigen Sie mir, was Sie meinen. Wenn Sie können.
Wir sprechen davon, die Möglichkeit des Einklemmens zwischen den Aufrufen der Funktionen GlobalVariableGet und GlobalVariableSet zu verhindern. Ein Einklemmen durch einen anderen Expert Advisor ist real, da Fehler immer noch beobachtet werden. Deshalb spreche ich von atomarem Zugriff. Sie und ich sprechen von der Lösung ein und desselben Problems, aber mit unterschiedlichen Worten
.
Übrigens, was ist an dem von mir überarbeiteten Code falsch? Ich meine, es ist klar, dass etwas nicht stimmt, da es nicht funktioniert, aber ich sehe den Fehler nicht. Meiner Vermutung nach hätte dies den exklusiven Zugang ermöglichen sollen...
while(!IsStopped()) { if(GlobalVariableGet(strTradeSemaphore) == 0.0) GlobalVariableSet(strTradeSemaphore, nMagic); if(GlobalVariableGet(strTradeSemaphore) == nMagic) break; Sleep(1000); }Ihr Beispiel ist besser