[ARCHIV]Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht daran vorbei. Ohne dich kann ich nirgendwo hingehen - 5. - Seite 207

 
solnce600:

Meine Herren, bitte sagen Sie mir, wie ich (wahrscheinlich in einer bedingten Anweisung) eine einfache Idee codieren kann

-wenn ein Geschäft mit einem Stop-Loss geschlossen wurde

-Eröffnung eines weiteren Geschäfts zum Stop-Loss-Kurs

Dankeschön

Schauen Siesich um.
 
Roger:

1. Sie können in der init()-Funktion keine Orders eröffnen (im Strategy Tester funktioniert dies noch, aber nicht in der Demo).

2. Wenn Sie Aufträge abschließen, sollten Sie vom Ende zum Anfang zählen, und nicht umgekehrt, wie in Ihrem Fall.

Ich danke Ihnen für Ihre Antwort.
In diesem Fall wurde der Schleifenoperator im Tester untersucht, deshalb werden die Orders zur Vereinfachung in init() geöffnet, was in echten EAs nicht passiert.
Eine Änderung der Reihenfolge der Auftragsauswahl führt tatsächlich zur Schließung von Aufträgen innerhalb eines Ticks (ich gebe den Code des Programms und den Bericht aus dem Testerprotokoll unten wieder).
Es scheint seltsam, dass MQL4 mir nicht erlaubt, die Reihenfolge der Arbeit mit Aufträgen zu ändern. Wenn Sie wissen, warum, bitte beraten, da nach der Arbeitslogik eines EA ich gehe, um Aufträge genau in der Reihenfolge zu schließen, sie geöffnet werden.

Mit freundlichen Grüßen. Schurkin.

Код программы.

//+------------------------------------------------------------------+
//|                                                     Poligon1.mq4 |
//|                                            21 февраля 2013 года. |
//|Тестирование оператора цикла for.                                 |
//+------------------------------------------------------------------+
#property copyright "21 февраля 2013 года."
#property link      ""
//+------------------------------------------------------------------+
//|Объявленные переменные                                            |
//+------------------------------------------------------------------+
int Mn=357;//Magic number
int i;//Показатель счётчика итераций
double PriTP;//TP серии
int Tick;//Счётчик тиков
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----Установка серии ордеров
OrderSend(Symbol(),OP_BUY,0.5,Ask,0,NormalizeDouble(Bid-35*Point,Digits),
NormalizeDouble(Ask+35*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,1,Ask,0,NormalizeDouble(Bid-25*Point,Digits),
NormalizeDouble(Ask+25*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,1.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,2.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,3.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUYLIMIT,1,NormalizeDouble(Ask-15*Point,Digits),0,
NormalizeDouble(Bid-40*Point,Digits),NormalizeDouble(Ask+25*Point,Digits),
NULL,Mn,0,CLR_NONE);//OP_BUYLIMIT
OrderSend(Symbol(),OP_SELLSTOP,3,NormalizeDouble(Ask-30*Point,Digits),0,
NormalizeDouble(Bid+15*Point,Digits),NormalizeDouble(Ask-75*Point,Digits),
NULL,Mn,0,CLR_NONE);//OP_SELLSTOP
//----
   PriTP=Bid;//PriTP
   Print("Кс0:"," OrdersTotal=",OrdersTotal());//Сообщение
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   Tick++;//Tick
//   Print("Кс1:"," Tick=",Tick);//Сообщение
//----
//   for(i=0;i<OrdersTotal();i++)//Инициализация цикла
   for(i=OrdersTotal()-1; i>=0; i--)//
   {
   Print("Кс2:"," Tick=",Tick," i=",i);//Сообщение
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)//Выбор ордера i
    {
   if(OrderSymbol()==Symbol())//Символ
     {
   if(OrderMagicNumber()==Mn)//Идентификационное число
      {
   if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Тип операции текущего выбранного ордера
       {
   OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Закрытие позиции
       }//Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
      }//Закрыто if(OrderMagicNumber()==Mn)
     }//Закрыто if(OrderSymbol()==Symbol()
    }//Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
   }//Закрыто for(i=0;i<OrdersTotal();i++)
//----
   return(0);
  }
//+------------------------------------------------------------------+
Записи в журнале тестера.

2013.03.08 13:28:19     Poligon1 EURUSD,M15: removed
2013.03.08 10:14:14     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=3 i=0
2013.03.08 10:14:14     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=3 i=1
2013.03.08 10:13:50     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=2 i=0
2013.03.08 10:13:50     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=2 i=1
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=0
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=1
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=2
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=3
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #5 buy 3.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=4
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=5
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=6
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс0: OrdersTotal=7
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #7 sell stop 3.00 EURUSD at 1.3367 sl: 1.3410 tp: 1.3322 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #6 buy limit 1.00 EURUSD at 1.3382 sl: 1.3355 tp: 1.3422 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #5 buy 3.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 ok
2013.03.08 10:13:26     Poligon1 test started
2013.03.08 10:13:24     Poligon1 EURUSD,M15: loaded successfully

 
Vielen Dank für die wertvollen Informationen, ich werde auf jeden Fall versuchen, alles, was Sie mir gesagt haben, in Zukunft zu berücksichtigen.
 
borilunad:

Sie werden nicht genau zum Stop-Loss-Kurs eröffnen können, aber Sie können sich darauf einstellen, in die gleiche oder entgegengesetzte Richtung zu eröffnen!

Hier ist ein Funktionsaufruf aus Kims "Nützliche Funktionen", den Sie in eine Bedingung einfügen können:

isCloseLastPosByStop - Gibt das Flag zum Schließen der letzten Position per Stop zurück

if(isCloseLastPosByStop() == 0) oder ... == 1) und was immer Sie wollen ......

Sie können die Funktion hier finden: https://www.mql5.com/ru/forum/131859

Und stellen Sie es vor den Start!

Und ich bitte Sie: Machen Sie das alles selbst, mit Fleiß, Genauigkeit und Geduld, sonst lernen Sie nichts aus den Hinweisen!

Wissen wird nur mit angemessener Anstrengung erworben! Machen Sie sich an die tägliche, neugierige Arbeit! Viel Glück!


Vielen Dank für die wertvollen Informationen, ich werde auf jeden Fall versuchen, alles, was Sie mir gesagt haben, in Zukunft zu berücksichtigen.
 

Guten Tag.

Bitte sagen Sie mir, ob es Situationen gibt, in denen TCs Kommentare zu einer Bestellung ändern oder löschen können?

Ich danke Ihnen vielmals.

 
Gek34:

Bitte teilen Sie mir mit, ob es Situationen gibt, in denen FKS Kommentare zu einer Bestellung ändern oder löschen können...?

Ein Beispiel.
Einheimischer Kommentar
e121220_3in1 01

Mit hinzugefügtem DC nach Rollover

e121220_3in1 01[swap]

Das heißt, wenn wir nach einem Auftrag mit einem Kommentar suchen, sollten wir vorher die Länge der ursprünglichen Kommentarzeile bestimmen und während der Suche nur den ersten Teil des geänderten Kommentars in der entsprechenden Länge überprüfen. Oder prüfen Sie, ob die ursprüngliche Zeichenfolge in dem zu prüfenden Kommentar enthalten ist.

 

Shurkin:

Vielen Dank für die Antwort.
In diesem Fall wurde die Arbeit des Loop-Operators im Tester genau untersucht, deshalb werden die Orders zur Vereinfachung in init() geöffnet, was in echten EAs nicht passiert.
Die Änderung der Reihenfolge der Auftragsauswahl führt dazu, dass die Aufträge innerhalb eines Ticks geschlossen werden (ich gebe den Code des Programms und den Bericht aus dem Testerprotokoll unten wieder).
Es scheint seltsam, dass MQL4 mir nicht erlaubt, einen Auftrag auszuwählen. Wenn Sie wissen, warum, bitte beraten, wie die Arbeitslogik des Expert Advisor schlägt vor, dass Aufträge genau in der Reihenfolge geschlossen werden sollten sie geöffnet werden.

Mit freundlichen Grüßen. Schurkin.



Die Logik ist korrekt - die Auftragsnummern der Aufträge sollten mit den Auftragsnummern übereinstimmen. Sobald ein Auftrag abgeschlossen ist, werden alle anderen neu berechnet. Versuchen Sie diese Konstruktion

 for(i=0, int k=0; i<OrdersTotal();i++,k++)//
   {
   Print("Кс2:"," Tick=",Tick," i=",i);//Сообщение
   if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)//Выбор ордера i
    {
   if(OrderSymbol()==Symbol())//Символ
     {
   if(OrderMagicNumber()==Mn)//Идентификационное число
      {
   if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Тип операции текущего выбранного ордера
       {
   OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Закрытие позиции
   k--;
       }//Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
      }//Закрыто if(OrderMagicNumber()==Mn)
     }//Закрыто if(OrderSymbol()==Symbol()
    }//Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
   }//Закрыто for(i=0;i<OrdersTotal();i++)
 
Gek34:

Guten Tag.

Bitte sagen Sie mir, ob es Situationen gibt, in denen TCs Kommentare zu einer Bestellung ändern oder löschen können?

Ich danke Ihnen vielmals.


Wir haben eine vollständige Änderung der Kommentare zu einem Auftrag erlebt. Außerdem wird die Magie bei teilweisen Abschlüssen manchmal auf Null gesetzt (teilweise Abschlüsse werden vom Server initiiert). Jetzt gibt es einen separaten, in einer Schleife angeordneten Berater, der "fremde" Aufträge und andere Unstimmigkeiten überwacht und rechtzeitig durch Push-Nachrichten meldet.
 

Bitte beraten Sie mich, wie ich die Bedingung richtig schreibe:

1.wenn Auftragssymbol = Symbol und Auftragsmagie = 135

2.wenn keine BAYSTOP-Aufträge anhängig sind

3.wenn es keine offenen Aufträge gibt BAY ODER (wenn es welche gibt) stoploss>offener Preis

4.wenn der Preis ist zwischen MA und es ist ein Fraktal bis

SCHWEBENDEN KAUFSTOPPAUFTRAG ERTEILEN

SO GESCHRIEBEN:

 static bool flag ;

   if(NewBar()==true)

     flag = true; 

     for(int i=0;i<total-1;i++) 

         {

         OrderSelect(i,SELECT_BY_POS); 

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

          { 

          if(OrderType()<=OP_BUYSTOP) 

           {

           if((OrderType()<=OP_BUY) || (OrderType()==OP_BUY && OrderStopLoss()>OrderOpenPrice()))  

            { 

            if(Ask<m && Ask>ma && frUP>0 && flag)

            {

              double price = NormalizeDouble(frUP+30*Point+(Ask-Bid)*Point,Digits);

             double stoploss = NormalizeDouble(price-sl*Point-30*Point,Digits);

             double takeprofit = NormalizeDouble(price+tp*Point,Digits);

             int ticket = OrderSend(Symbol(),OP_BUYSTOP,Lots,price,5,stoploss,takeprofit,"R",135,TimeCurrent()+55000,Blue);

             if(ticket>0)

               {

               Alert("R!Отложенный ордер BUYSTOP!!! ",Symbol());

               flag = false;

               }

               else

               {

               Print("Lots= ", Lots,"price= ", price,"stoploss= ", stoploss,"takeprofit= ", takeprofit,"Ошибка № ",GetLastError());      

               return;

               }

             }

           }

         }

       }

     } 

FUNKTIONIERT NICHT! SAGEN SIE MIR, WO DER FEHLER LIEGT!

 

Bitte teilen Sie mir mit, was die Ursache für das folgende Problem sein könnte.

Es gibt einen Indikator, der externe Funktionen verwendet. Der kompilierte Bibliothekscode befindet sich im Ordner libraries, descriptors - in include.

Verbindung #include <lib_Zemckikh.mqh>. Beim ersten Durchlauf des Indikators arbeiten alle Bibliotheksfunktionen normal, der Indikator wird auf dem Chart angezeigt. Nach einer Parameteränderung (nach einer Neuberechnung des Indikators) werden die Bibliotheksfunktionen nicht aufgerufen, der Indikator wird nicht angezeigt, es gibt keine Einträge in der Registerkarte "Experten" nach der Parameteränderung.

Wenn Sie die Verbindung der Bibliothek ausschließen und die erforderlichen Funktionen in die Indikatordatei (direkt mit den Funktionen kompiliert) einfügen, funktioniert alles problemlos.

Ich kann nicht verstehen, was los ist. Ich möchte das Forum nicht verunreinigen, daher füge ich die Codes nicht bei. Wenn Sie es brauchen, schicke ich es Ihnen persönlich zu.