Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 189

 
Youri Lazurenko:

Ich habe es so: Ich eröffne einen Auftrag mit Null TP und SL und ändere dann (den Auftrag) mit den erforderlichen TP- und SL-Parametern. Ich schrieb bereits, alles funktioniert und funktionierte gut auf anderen Konten, nur auf ndd so etwas. Ich habe noch nie mit jemandem mit ähnlichen Konten gearbeitet, kann also keine Vergleiche anstellen. Vielleicht piept es nur bei forex4u, vielleicht aber auch bei allen ndd-Konten. Das würde ich gerne für die Zukunft wissen.
Da Sie einen Fehler von 130 haben, sehen Sie sich die Parameter der Stop-Order an. In jedem Fall sollten sie nicht näher als der in den Servereinstellungen festgelegte StopLevel-Wert sein. Wenn er gleich Null ist, dann verwenden Sie den doppelten Spread+1-Punkt
 
Youri Lazurenko:

Ich habe es so: Ich eröffne einen Auftrag mit Null TP und SL und ändere ihn dann mit den richtigen TP- und SL-Parametern. Ich schrieb bereits, alles funktioniert und funktionierte gut auf anderen Konten, nur auf ndd so etwas. Ich habe noch nie mit jemandem mit ähnlichen Konten gearbeitet, kann also keine Vergleiche anstellen. Vielleicht piept es nur bei forex4u, vielleicht aber auch bei allen ndd-Konten. Möchte für weitere Informationen wissen.

Verwenden Sie diese Funktionen bei der Eröffnung von Positionen, um die richtigen Stopps und Takes zu berechnen:

//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
   int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
   int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   return((lv==0)?sp*2:lv);
}
//+------------------------------------------------------------------+
 
Alexey Viktorov:

Was ist der Unterschied?

Pips = Ladung/Lots/Tickwert in bestimmten Zahlen 8/2/4 = 1

oder

Pips = Charge/(Lots*Tickwert) in konkreten Zahlen 8/(2*4) = 8/8 = 1

Bruchzahlen können auch verwendet werden...


Der Unterschied besteht darin, dass mein Namensvetter aus irgendeinem Grund auch mitPoint multipliziert:(OrderCommission()/(tv*OrderLots()))*Point()
 
Artyom Trishkin:
Wenn Sie den Fehler 130 haben, dann schauen Sie sich die Parameter der Stoppaufträge an. In jedem Fall dürfen sie nicht näher als der in den Servereinstellungen festgelegte StopLevel-Wert sein. Wenn sie gleich Null ist, dann wird die doppelte Spanne + 1 Punkt verwendet.


Vielen Dank für die Informationen, die Sie in Ihrem nächsten Beitrag geben werden.

Das Problem ist, dass ich überhaupt keine Stopps gesetzt habe (Mittelwertbildung). Und warum ist dieser Fehler nicht vorhanden, wenn ich das Terminal am Morgen starten und Änderung auftritt, aber nur vorhanden (Fehler) zu Beginn der Sitzung bei der Eröffnung einer Bestellung (Tagescharts) und wenn es eine auf ein Paar. Der technische Support hat geantwortet, dass es für diese Änderung weder zeitliche noch entfernungsbezogene Beschränkungen gibt (die Spanne ist nicht wichtig).

Ich werde versuchen, einige Experimente mit allen Empfehlungen durchzuführen, und ich werde später meine Schlussfolgerungen ziehen.

Nochmals herzlichen Dank.

 
Vitalie Postolache:

Der Unterschied besteht darin, dass mein Namensvetter aus irgendeinem Grund auch mit Point multipliziert:(OrderCommission()/(tv*OrderLots()))*Point()

OK, ich antworte: Es gibt einen Preis von 1,0520, in Berechnungen haben wir die Zahl (int)Comm, dann müssen wir sie zum Preis addieren / subtrahieren = 1,0520 + (int)Comm ? Nun, um nicht mit Punkt zu multiplizieren - dies wird sofort getan.

 
Youri Lazurenko:


Vielen Dank für die Informationen, die Sie in Ihrem nächsten Beitrag geben werden.

Die Sache ist die, dass ich überhaupt keine Stopps (Mittelwertbildung) eingestellt habe. Und warum ist dieser Fehler nicht vorhanden, wenn ich das Terminal am Morgen starten und Änderung auftritt, aber nur vorhanden (Fehler) zu Beginn der Sitzung bei der Eröffnung einer Bestellung (Tagescharts) und wenn es eine auf ein Paar. Der technische Support hat geantwortet, dass es für diese Änderung weder zeitliche noch entfernungsbezogene Beschränkungen gibt (die Spanne ist nicht wichtig).

Ich werde versuchen, einige Experimente mit allen Empfehlungen durchzuführen, und ich werde später meine Schlussfolgerungen ziehen.

Nochmals herzlichen Dank.

Bitte sehr.

So verwenden Sie es: Kopieren Sie in der Funktion der Positionseröffnung statt des Stopps in Pips den Funktionsaufruf, in dem Sie den Stopp in Pips setzen. Oder Sie geben den Stoppkurs direkt ein - der Compiler wählt dann die gewünschte Funktion aus. Dasselbe gilt für die Gewinnmitnahme.

Beispiel:

double price=SymbolInfoDouble(Symbol(),SYMBOL_ASK);         // Цена открытия для Buy
double sl=CorrectStopLoss(Symbol(), OP_BUY, price, 200);    // Стоп в 200 пунктов (вместо пунктов можно вписать расчётную цену, например Ask+200*Point() или значение цены МА)
double tp=CorrectTakeProfit(Symbol(), OP_BUY, price, 300);  // Тейк в 300 пунктов (если вписать расчётную цену, то будет использоваться тип функции с double-параметром)
OrderSend(Symbol(),OP_BUY,Lots,price,slippage,sl,tp,"Комментарий ордера",Magic,0,clrBlue);
 
Vitaly Muzichenko:

OK, ich antworte: Es gibt einen Preis von 1,0520, in Berechnungen haben wir die Zahl (int)Comm, dann müssen wir sie zum Preis addieren / subtrahieren = 1,0520 + (int)Comm ? Nun, um nicht mit Punkt zu multiplizieren - dies wird sofort getan.


Nun, dann ist es vielleicht so. Es ist nur so, dass die Frage ursprünglich gestellt wurde, wie man die Provision in Pips und nicht in den Preis umrechnen kann.
 
Artyom Trishkin:

Bitte sehr.

Gehen Sie folgendermaßen vor: Geben Sie in der Funktion zur Eröffnung einer Position anstelle des Stopps in Pips den Aufruf der Funktion ein, in der Sie den Stopp in Pips ersetzen möchten. Oder der Stoppkurs wird direkt eingegeben - der Compiler wählt die gewünschte Funktion aus. Dasselbe gilt für die Gewinnmitnahme.

Beispiel:

Nochmals herzlichen Dank. Ich wünsche Ihnen alles Gute.
 
Bitte um Ratschläge Sehr geehrte Damen und Herren: Ich zeichne Fibonacci-Linien mit verschiedenen Farben und Stilebenen und stelle immer die gleiche wie die letzte ein, wie kann ich das beheben?

                  ObjectCreate(0,Fibo_Arrow,OBJ_FIBO,0,Time[0],Close[0],Time[0],price); // создание метки стпа на графике   
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_HIDDEN,true);        // Запрет на показ имени графического объекта в списке объектов 
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_SELECTABLE,false);   // запрет на выделение перемещение объекта мышью   
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_RAY_RIGHT,false);    // луч вправо
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_TOOLTIP,"r\n");       // подпись линии и и её длины в подсказку                  
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_COLOR,1,clrNONE);       // цвет   
                  
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELS,3);           // установим количество уровней   
                      
                  ObjectSetDouble(0,Fibo_Arrow,OBJPROP_LEVELVALUE,0,1.5);  // значение уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELCOLOR,0,Green);  // цвет уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELSTYLE,0,2);     // стиль уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELWIDTH,0,0);     // толщина уровня 
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_LEVELTEXT,0,"0.5"); // описание уровня 
                  
                  ObjectSetDouble(0,Fibo_Arrow,OBJPROP_LEVELVALUE,1,2);  // значение уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELCOLOR,1,Lime);  // цвет уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELSTYLE,1,0);     // стиль уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELWIDTH,1,0);     // толщина уровня 
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_LEVELTEXT,1,"1"); // описание уровня 
                  
                  ObjectSetDouble(0,Fibo_Arrow,OBJPROP_LEVELVALUE,2,2.5);  // значение уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELCOLOR,2,Green);  // цвет уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELSTYLE,2,2);     // стиль уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELWIDTH,2,0);     // толщина уровня 
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_LEVELTEXT,2,"1.5"); // описание уровня 
 
Money_Maker:
Sehr geehrte Experten, bitte beraten Sie: Ich baue Fibonacci-Linien mit verschiedenen Farben und Stil der Ebenen, aber immer die gleiche wie die letzte, wie zu beheben? redraw und Slip ist nicht hilfreich, in jedem Ort(

Bei diesem Objekt können Sie nicht für jede Linie einen anderen Stil und eine andere Farbe wählen. Zeichnen Sie separate Linien, wenn Sie einen Regenbogen wünschen.