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

 
Bitte helfen Sie mir, die Fehler in dieser Funktion zu beheben. Sie hat bereits den ganzen Saft aus mir herausgepresst. Das Wesen der Funktion, wenn es einen bestimmten Gewinn erreicht, sollte die Funktion die Hälfte der Bestellung zu schließen.
void CloseHalfOrder(){

for (int i = 0; i<=OrdersTotal(); i++)
{
if (OrderSelect (i,SELECT_BY_POS,MODE_TRADES) == true)
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderProfit()>= NormalizeDouble (TP*Point,Digits))
{
if (OrderType() == OP_BUY)
double Lots = OrderLots();
double HalfLot = NormalizeDouble (Lots*0.5,2);
OrderClose(OrderTicket(),HalfLot,Bid,0,HotPink);

if (OrderType() == OP_SELL)
double Lots1 = OrderLots();
double HalfLot1 = NormalizeDouble (Lots*0.5,2);
OrderClose(OrderTicket(),HalfLot1,Ask,0,HotPink);
}
}
}
}

Oh, und wie kann ich erreichen, dass diese Funktion nur einmal pro offenem Auftrag funktioniert?
 
Trader7777:
Bitte helfen Sie mir, die Fehler in dieser Funktion zu beheben. Sie hat bereits den ganzen Saft aus mir herausgepresst. Das Wesen der Funktion, wenn es einen bestimmten Gewinn erreicht, sollte die Funktion die Hälfte der Bestellung zu schließen.
Oh, und wie kann ich erreichen, dass diese Funktion nur einmal pro offenem Auftrag funktioniert?
Das Prinzip der Teilschließung finden Sie hier.
 
Trader7777:
Bitte helfen Sie mir, die Fehler in dieser Funktion zu beheben. Sie hat bereits den ganzen Saft aus mir herausgepresst. Das Wesen der Funktion, wenn es einen bestimmten Gewinn erreicht, sollte die Funktion die Hälfte der Bestellung zu schließen.

void CloseHalfOrder(){

for (int i = 0; i<=OrdersTotal(); i++)
{
if (OrderSelect (i,SELECT_BY_POS,MODE_TRADES) == true)
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic){//Нефига тут профиту делать, это так, для убыстрения....

if(OrderProfit()>= NormalizeDouble (TP*Point,Digits)) //А тут вообще непонятки что с чем сравниваете....
{
if (OrderType() == OP_BUY)
double Lots = OrderLots();
double HalfLot = NormalizeDouble (Lots*0.5,2);// Тут озаботится чтобы лот не стал меньше минимального
OrderClose(OrderTicket(),HalfLot,Bid,0,HotPink);

if (OrderType() == OP_SELL)
double Lots1 = OrderLots();
double HalfLot1 = NormalizeDouble (Lots*0.5,2);
OrderClose(OrderTicket(),HalfLot1,Ask,0,HotPink);
}
}
}

}


}

Oh, und wie kann ich erreichen, dass diese Funktion nur einmal pro offenem Auftrag funktioniert?
 
TarasBY:
Das Prinzip des teilweisen Abschlusses von Aufträgen können Sie hier sehen.

Ich danke Ihnen. Aber ich möchte vor allem meine Fehler verstehen. Ich bin noch am Lernen. Außerdem glaube ich, dass ich der Wahrheit sehr nahe bin.

 

ein weiteres Mal... Die Funktion funktioniert nicht. Ich möchte die Fehler verstehen. + Wie kann ich erreichen, dass es nur 1 Mal für einen offenen Auftrag ausgelöst wird? Herzlichen Dank im Voraus)

extern int TP         = 200; // это количество пунктов после которых должно произойти частичное закрытие
extern int Magic      = 77;


void CloseHalfOrder(){

for (int i = 0; i<=OrdersTotal(); i++)
  {
    if (OrderSelect (i,SELECT_BY_POS,MODE_TRADES) == true)
      {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderProfit()>= NormalizeDouble (TP*Point,Digits))
          {
            if (OrderType() == OP_BUY) 
            double Lots = OrderLots(); 
            double HalfLot  = NormalizeDouble (Lots*0.5,2); // изначально ( при открытии ордера) лот рассчитывается так, что он не может быть меньше чем 0,02
            OrderClose(OrderTicket(),HalfLot,Bid,0,HotPink);
          
            if (OrderType() == OP_SELL)
            double Lots1 = OrderLots(); 
            double HalfLot1  = NormalizeDouble (Lots*0.5,2);
            OrderClose(OrderTicket(),HalfLot1,Ask,0,HotPink);
          }
        }
      }
    }
 
Trader7777:

ein weiteres Mal... Die Funktion funktioniert nicht. Ich möchte die Fehler verstehen. + Wie kann ich erreichen, dass es nur 1 Mal für einen offenen Auftrag ausgelöst wird?


Die einmalige Bedingung für eine Bestellung ist nicht sehr klar. Nun, wir werden hier wahrscheinlich globale Variablen verwenden müssen. Vielleicht gibt es mehr als einen Auftrag, und nur einen für jeden?
 
Trader7777:

ein weiteres Mal... Die Funktion funktioniert nicht. Ich möchte die Fehler verstehen. + Wie kann ich erreichen, dass es nur 1 Mal für einen offenen Auftrag ausgelöst wird?

Nach Losgröße filtern
 

Ich habe die folgende Situation. Es gibt mehrere Module in der EA, jedes Modul nimmt mehrere benutzerdefinierte Funktionen. Um nicht im Code zu ertrinken, habe ich beschlossen, jedes Modul in Skripte zu packen. Hier ist die Variante des Aufrufs des Skripts aus dem Expert Advisor. Das nächste Problem tritt jedoch auf: Wenn ich das Skript aufrufe, muss ich ihm einige Parameter übergeben. Wir können globale Variablen verwenden. Welche anderen Varianten können vorgeschlagen werden?

Um es gleich vorweg zu sagen: Die "einfachere" Variante über iCustom() liegt mir nicht, und zwar aus zwei Gründen. Erstens sollte der Aufruf des Moduls gelegentlich im Speicher erfolgen und nicht konstant sein. Zweitens verwende ich keine Indikator-Arrays.

 
Sepulca:

Die einmalige Bedingung für eine Bestellung ist nicht sehr klar. Wahrscheinlich müssen Sie hier globale Variablen verwenden. Kann es mehrere Aufträge geben und nur einen Zeitpunkt für jeden?

Es kann nur einen Auftrag auf dem Markt geben. Im Moment funktioniert diese Funktion aus irgendeinem Grund überhaupt nicht... Aber wenn es richtig funktioniert, verstehe ich, dass es die ganze Zeit ausgelöst wird, solange der Gewinn höher ist als der eingestellte Betrag von Pips. Natürlich müssen wir die Hälfte einer Position einmal schließen, und das war's. Aber ich wünschte, es würde wenigstens einmal funktionieren.)
 
gyfto:

Ich habe die folgende Situation. Es gibt mehrere Module in der EA, jedes Modul nimmt mehrere benutzerdefinierte Funktionen. Um nicht im Code zu ertrinken, habe ich beschlossen, jedes Modul in Skripte zu packen. Hier ist die Variante des Aufrufs des Skripts aus dem Expert Advisor. Das nächste Problem tritt jedoch auf: Wenn ich das Skript aufrufe, muss ich ihm einige Parameter übergeben. Wir können globale Variablen verwenden. Welche anderen Varianten können vorgeschlagen werden?

Um es gleich vorweg zu sagen: Die "einfachere" Variante über iCustom() liegt mir nicht, und zwar aus zwei Gründen. Erstens sollte der Aufruf des Moduls gelegentlich im Speicher erfolgen und nicht konstant sein. Zweitens: Ich verwende keine Indikator-Arrays.


Eine Bibliothek ist eine Option.