Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 1093

 
A13ksandr:Entschuldigung! Natürlich geschieht alles in void OnTick(). Ich habe es aufgeschrieben)
Dann gibt es einen Fehlercode im Protokoll des Testers, den Sie verwenden können, um das Problem zu lösen.
 
evillive:
In diesem Fall wird im Journal des Prüfers ein Fehlercode eingetragen, der für weitere Untersuchungen verwendet werden kann.

Kein Fehler. Er bleibt bei der Eingabe eines Vorgangs einfach hängen. Und dann gibt es noch StartSell, das wird ganz normal eingegeben. Das ist ein ziemliches Durcheinander.

Ich habe die Anführungszeichen aktualisiert und es funktioniert. Es ist zwar nicht ganz korrekt, weil es einige Löcher hat, aber wenigstens hängt es nicht.

 

Guten Tag, könnten Sie mir bitte sagen, wie ich am besten verhindern kann, dass bei binären Optionen mehr als eine bestimmte Anzahl von Serien für verschiedene Instrumente gleichzeitig geöffnet werden (der Bot ist an mehrere Charts verschiedener Instrumente zur gleichen Zeit angeschlossen)?

extern double Lots = 1; // Lose

extern int Exp = 1; // Verfall

extern int Wait = 0; // Anzahl der Candlesticks einer Richtung

extern int Timeout = 1; // Zeitfenster

extern double Multiplikator = 3; // Multiplikator

extern int int Schlupf = 5; // Schlupf

extern int MaxOpenOrders = 1; // Maximale Anzahl von gleichzeitig geöffneten Aufträgen

extern int Magic = 774274; // Magie


int ticket, Typ;

doppelter Preis, Los;

//+------------------------------------------------------------------+

Experten-Initialisierungsfunktion //|.

//+------------------------------------------------------------------+

int OnInit()

{

return(INIT_SUCCEEDED);

}

//+------------------------------------------------------------------+

//| Experten-Deinitialisierungsfunktion |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

{

}

//+------------------------------------------------------------------+

//| Experten-Tick-Funktion |

//+------------------------------------------------------------------+

void OnTick()

{

--------------- Offene Geschäfte ---------------

if (CountTrades() == 0) // Anzahl der Aufträge muss gleich Null sein

{

if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL))

// Wenn der letzte Handel einen Verlust aufweist, wird derselbe Handel eröffnet, jedoch mit einem größeren Los.

{

Typ = TypeLastHistOrder();

if (Typ == OP_BUY) Preis = Ask;

if (Typ == OP_SELL) Preis = Bid;

Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);

ticket = OrderSend(Symbol(), Typ, Lot, Preis, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)

// wenn der Gewinn des letzten Geschäfts gleich Null ist, wird das gleiche Geschäft eröffnet

{

Typ = TypeLastHistOrder();

if (Typ == OP_BUY) Preis = Ask;

if (Typ == OP_SELL) Preis = Bid;

Lot = NormalizeDouble(LotsLastHistOrder(), 2);

ticket = OrderSend(Symbol(), Typ, Lot, Preis, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL))

|| CountHistTrades() == 0)// Wenn der letzte Handel profitabel ist, wird die Order eröffnet

{

if (SignalBuy() && MaxOpenOrders > OrdersTotal())

{

ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (SignalSell() && MaxOpenOrders > OrdersTotal())

{

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

}

}

}

//+------------------------------------------------------------------+

int CountTrades(int type = -1)

{

int cnt = 0;

for (int i=OrdersTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

cnt++;

}

}

zurück(cnt);

}

//+------------------------------------------------------------------+

int CountHistTrades(int type = -1)

{

int cnt = 0;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

cnt++;

}

}

zurück(cnt);

}

//+------------------------------------------------------------------+

bool SignalBuy()

{

for (int i=1; i<=Wait; i++)

{

if (Close[i] > Open[i]) return(false)

}

wenn ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))

&& CountHistTrades() > 0) return(true);

if (CountHistTrades() == 0) return(true);

return(false);

}

//+------------------------------------------------------------------+

bool SignalSell()

{

for (int i=1; i<=Wait; i++)

{

if (Close[i] < Open[i]) return(false)

}

wenn ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))

&& CountHistTrades() > 0) return(true);

if (CountHistTrades() == 0) return(true);

return(false);

}

//+------------------------------------------------------------------+

datetime TimeLastHistOrder(int type = -1)

{

datetime lasttime = 0;

datetime opentime = 0;


for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

if (OrderCloseTime() > lasttime)

{

lasttime = OrderCloseTime();

opentime = OrderOpenTime();

}

}

}

}

return(opentime);

}

//+------------------------------------------------------------------+

int TypeLastHistOrder()

{

datetime time = 0;

int Typ = -1;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

{

if (OrderCloseTime() > time)

{

time = OrderCloseTime();

type = OrderType();

}

}

}

}

return(type);

}

//+------------------------------------------------------------------+

double LotsLastHistOrder(int type = -1)

{

datetime time = 0;

double lots = 0;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

wenn (OrderOpenTime() > Zeit)

{

time = OrderOpenTime();

time = OrderLots();

}

}

}

}

return(lots);

}

//+------------------------------------------------------------------+

double PriceCloseLastHistOrder(int type = -1)

{

datetime time = 0;

double price = 0;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

if (OrderCloseTime() > time)

{

time = OrderCloseTime();

Preis = OrderClosePrice();

}

}

}

}

}

}

//+------------------------------------------------------------------+

double PriceOpenLastHistOrder(int type = -1)

{

datetime time = 0;

double price = 0;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

if (OrderCloseTime() > time)

{

time = OrderCloseTime();

Preis = OrderOpenPrice();

}

}

}

}

}

}

//+------------------------------------------------------------------+

 
alvlaf:

Löschen Sie einfach die Bedingung OrderSymbol() == Symbol() aus der Funktion CountTrades und fügen Sie OrderType() == OP_BUY || OrderType() == OP_SELL hinzu, oder?

Und die Bedingung if (SignalBuy() && CountTrades() < MaxOpenOrders) in OnTick vor OrderSend ändern... Dasselbe gilt für Sell.
 
A13ksandr:
Danke, ich habe es ausprobiert - der Bot hat bei jedem Tick eine Reihe von Aufträgen eröffnet.
 
A13ksandr:

if (OrderMagicNumber() == Magic && (OrderType() == OrderType() == OP_BUY || OrderType() == OP_SELL))

Habe ich es richtig geändert?

 
alvlaf:

Guten Tag, könnten Sie mir bitte sagen, wie ich am besten verhindern kann, dass bei binären Optionen mehr als eine bestimmte Anzahl von Serien für verschiedene Instrumente gleichzeitig geöffnet werden (der Bot ist an mehrere Charts verschiedener Instrumente zur gleichen Zeit angeschlossen)?

extern double Lots = 1; // Lose

extern int Exp = 1; // Verfall

extern int Wait = 0; // Anzahl der Candlesticks einer Richtung

extern int Timeout = 1; // Zeitfenster

extern double Multiplikator = 3; // Multiplikator

extern int int Schlupf = 5; // Schlupf

extern int MaxOpenOrders = 1; // Maximale Anzahl von gleichzeitig geöffneten Aufträgen

extern int Magic = 774274; // Magie


int ticket, Typ;

doppelter Preis, Los;

//+------------------------------------------------------------------+

Experten-Initialisierungsfunktion //|.

//+------------------------------------------------------------------+

int OnInit()

{

return(INIT_SUCCEEDED);

}

//+------------------------------------------------------------------+

//| Experten-Deinitialisierungsfunktion |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

{

}

//+------------------------------------------------------------------+

//| Experten-Tick-Funktion |

//+------------------------------------------------------------------+

void OnTick()

{

--------------- Offene Geschäfte ---------------

if (CountTrades() == 0) // Anzahl der Aufträge muss gleich Null sein

{

if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL))

// Wenn der letzte Handel ein Verlustgeschäft war, wird derselbe Handel eröffnet, aber mit einem größeren Los.

{

Typ = TypeLastHistOrder();

if (Typ == OP_BUY) Preis = Ask;

if (Typ == OP_SELL) Preis = Bid;

Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);

ticket = OrderSend(Symbol(), Typ, Lot, Preis, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)

// wenn der Gewinn des letzten Geschäfts gleich Null ist, wird das gleiche Geschäft eröffnet

{

Typ = TypeLastHistOrder();

if (Typ == OP_BUY) Preis = Ask;

if (Typ == OP_SELL) Preis = Bid;

Lot = NormalizeDouble(LotsLastHistOrder(), 2);

ticket = OrderSend(Symbol(), Typ, Lot, Preis, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL))

|| CountHistTrades() == 0)// Wenn der letzte Handel profitabel ist, wird die Order eröffnet

{

if (SignalBuy() && MaxOpenOrders > OrdersTotal())

{

ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (SignalSell() && MaxOpenOrders > OrdersTotal())

{

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

}

}

}

//+------------------------------------------------------------------+

int CountTrades(int type = -1)

{

int cnt = 0;

for (int i=OrdersTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

cnt++;

}

}

zurück(cnt);

}

//+------------------------------------------------------------------+

int CountHistTrades(int type = -1)

{

int cnt = 0;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

cnt++;

}

}

zurück(cnt);

}

//+------------------------------------------------------------------+

bool SignalBuy()

{

for (int i=1; i<=Wait; i++)

{

if (Close[i] > Open[i]) return(false)

}

wenn ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))

&& CountHistTrades() > 0) return(true);

if (CountHistTrades() == 0) return(true);

return(false);

}

//+------------------------------------------------------------------+

bool SignalSell()

{

for (int i=1; i<=Wait; i++)

{

if (Close[i] < Open[i]) return(false)

}

wenn ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))

&& CountHistTrades() > 0) return(true);

if (CountHistTrades() == 0) return(true);

return(false);

}

//+------------------------------------------------------------------+

datetime TimeLastHistOrder(int type = -1)

{

datetime lasttime = 0;

datetime opentime = 0;


for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

if (OrderCloseTime() > lasttime)

{

lasttime = OrderCloseTime();

opentime = OrderOpenTime();

}

}

}

}

return(opentime);

}

//+------------------------------------------------------------------+

int TypeLastHistOrder()

{

datetime time = 0;

int Typ = -1;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

{

if (OrderCloseTime() > time)

{

time = OrderCloseTime();

type = OrderType();

}

}

}

}

return(type);

}

//+------------------------------------------------------------------+

double LotsLastHistOrder(int type = -1)

{

datetime time = 0;

double lots = 0;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

wenn (OrderOpenTime() > Zeit)

{

time = OrderOpenTime();

time = OrderLots();

}

}

}

}

return(lots);

}

//+------------------------------------------------------------------+

double PriceCloseLastHistOrder(int type = -1)

{

datetime time = 0;

double price = 0;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

if (OrderCloseTime() > time)

{

time = OrderCloseTime();

Preis = OrderClosePrice();

}

}

}

}

}

}

//+------------------------------------------------------------------+

double PriceOpenLastHistOrder(int type = -1)

{

datetime time = 0;

double price = 0;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

if (OrderCloseTime() > time)

{

time = OrderCloseTime();

Preis = OrderOpenPrice();

}

}

}

}

}

}

//+------------------------------------------------------------------+

Bitte sagen Sie mir, für welchen Zweck Sie MagicNumber verwenden, was bringt es in dieser Strategie? IMHO können Sie auch die OnInit OnDeinit Funktion hier wegwerfen
 
evillive:


Die Zeit kann direkt im Datetime-Format eingestellt werden, so dass keine Zeit für die Konvertierung verschwendet werden muss:

extern datetime StartTime = D'07:00';

In diesem Format erhalten wir beim Starten des EA das Datum der Erstellung des EA, während wir wollen, dass das Datum heute ist.

Wie kann man sie korrigieren?

 
RichLux:

Dieses Zeitformat gibt das Datum der EA-Erstellung beim Start des EA an, aber ich möchte das heutige Datum haben.

Wie kann man das beheben?

Sie ändern den Parameter beim Start auf den gewünschten Wert, wie die anderen Benutzerparameter auch.

Und aus irgendeinem Grund zeigt es mir das aktuelle Datum zum Zeitpunkt der Ausführung des Skripts an.

 
LRA:
Bitte sagen Sie mir, was der Zweck der Verwendung von MagicNumber ist, was bringt es in dieser Strategie? IMHO können Sie auch die OnInit OnDeinit Funktionen hier wegwerfen
Welchen Zweck haben die Worte "in dieser Strategie"? Magie wird benötigt, wenn Sie manuell im Konto handeln oder einen anderen Expert Advisor ausführen, damit diese Aufträge nicht berührt werden. Ich glaube schon.