Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 128

 
Anatoliy Ryzhakov:

Verkaufsauftrag wird zum Briefkurs geschlossen

Ich bin ein wenig verwirrt! Zeigen Sie mit dem Finger darauf, wo der Fehler im Code liegt!(Protokoll sagt ORDER CLOSE ERROR 4108) Vielen Dank im Voraus!

 

Guten Tag, liebe Genießer! Haben Sie den härtesten Tag des Jahres schon hinter sich? Können wir zur Sache kommen? ;=).

Ich zeichnete ein EA, alles ist gut, aber MQL, wie ich es verstehe, funktioniert in MT4-Umgebung. Ich möchte, dass es mit Software funktioniert, die direkt mit der Börse zusammenarbeitet. Gibt es noch andere MQL-Compiler? Wenn nicht, welche Sprache sollte ich verwenden, um MQL neu zu schreiben?

 
STARIJ:

Sie haben eine Pause, und Sie müssen weitermachen.

Ich habe keine Pause. Was ist der Grund dafür, dass der EA seine Aufträge nicht "sehen" kann? Ich habe unterschiedliche Server- und Computerzeiten, vielleicht deswegen?

 
Anatoliy Ryzhakov: Ich habe keine Pause. Was ist der Grund dafür, dass der EA seine Aufträge nicht "sehen" kann? Meine Serverzeit und meine Computerzeit sind unterschiedlich.

Die Zeit ist bei jedem anders. Beginnen Sie ohne Eile aus der Ferne. 1. Prüfen Sie, was die Funktion OrdersTotal Ihnen liefert. Sein Wert hängt von den Einstellungen für die Historie ab: Heute, letzte 3 Tage, letzte Woche, ... Stellen Sie ihn nach Belieben ein. 2. Erstellen Sie dann einen Zyklus und geben Sie alle Aufträge mit Alert aus. Dies wird als Debugging bezeichnet und ist ein sehr wichtiger Teil der Arbeit eines Programmierers. Das ist wichtiger als das Schreiben von Code.

 
Bitte beraten Sie mich, wie man den Fehler der ungültigen Lots-Menge für die Funktion FreeMarginCheck in EA beheben kann, wenn versehentlich ein negativer Volumenwert (Lot) eingestellt wird. Um eine Meldung über ein falsches Los, ohne Fehlermeldung, im Prüfgerät zu haben.

 
STARIJ:

Die Zeit ist bei jedem anders. Beginnen Sie ohne Eile aus der Ferne. 1. Prüfen Sie, was die Funktion OrdersTotal Ihnen liefert. Sein Wert hängt von den Einstellungen für die Historie ab: Heute, letzte 3 Tage, letzte Woche, ... Passen Sie ihn nach Belieben an. 2. Erstellen Sie dann einen Zyklus und geben Sie alle Aufträge mit Alert aus. Dies wird als Debugging bezeichnet und ist ein sehr wichtiger Teil der Arbeit eines Programmierers. Das ist wichtiger als das Schreiben des Codes.

Ich danke Ihnen!

 

Können Sie mir sagen, wie man in den Code des Expert Advisor zu schreiben, um 3 Trades auf einmal mit der Fähigkeit, SL setzen zu öffnen?

Hier ist mein Zustand

if(MA_1>MA_2)
ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-SL*Point,Bid+TP*Point,NULL,0,0,clrGreen);
if(MA_1<MA_2)
ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+SL*Point,Ask-TP*Point,NULL,0,0,clrRed);

Mir wurde geraten, die Funktion (OrdersTotal()) zu verwenden, aber das passt in meinem Fall nicht. Bei mir sieht es so aus

void OnTick()
  {
//---
   double MA_1;
   MA_1=iMA(_Symbol,0,1,0,1,0,0);
   double MA_2;
   MA_2=iMA(_Symbol,0,6,0,1,0,0);
   int ticket=0;
   if(OrdersTotal()<=3)
     {
      if(MA_1>MA_2)
         ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-SL*Point,Bid+TP*Point,NULL,0,0,clrGreen);
      if(MA_1<MA_2)
         ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+SL*Point,Ask-TP*Point,NULL,0,0,clrRed);
     }
//---
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

Es kompiliert gut, keine Fehler, aber es ist nicht geeignet für meinen Fall.

Ich habe den folgenden Code gefunden

#property copyright "Влад Сергеев для mmgp" 
#property version   "1.00" 
#property strict 
#property script_show_inputs 

input int      orders = 4;      //всего ордеров в серии 
input bool     buy = true;      //флаг разрешающий/запрещающий покупки 
input bool     sell = false;    //флаг разрешающий/запрещающий продажи 
input int      magic = 100500;  //уникальный номер для ордеров, открываемых этим скриптом 
input double   lot = 0.01;      //объем каждого ордера серии 
input int      tp = 100;        //тейк профит, в пунктах 
input int      sl = 100;        //стоп лосс, в пунктах 
input int      slip = 2;        //допустимое проскальзывание на открытии, в пунктах (для ECN, где открытие по рынку - игнор) 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   int i=0;  // для чего эта переменная
   int ticket=0;
   if(buy) 
     {
      while(i<orders) // здесь эта переменная используется чтобы сравнивать ордера или для чего
        {
         RefreshRates(); // если убрать эту функцию коду хуже не становится
         ticket=OrderSend(Symbol(),OP_BUY,lot,NormalizeDouble(Ask,Digits),slip,0,0,"",magic,0,clrBlue); //здесь понятно
         if(ticket!=-1) // эта строчка тоже не понятна
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))  // функция для выбора ордера это логично но тоже не понятно как ей пользоваться
              {
               OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-sl*Point,Digits),NormalizeDouble(OrderOpenPrice()+tp*Point,Digits),0,clrBlue);
               // эту строчку тоже хотел бы чтобы объяснили
              }
           }
         i++; // что увеличивается на оду единицу это относится к магическому номеру ордера чтобы программа понимала что у неё есть ордера
        }
     }
   i=0;
   if(sell) // прошлая запись была для покупак эта для продаж 
     {
      while(i<orders) 
        {
         RefreshRates();
         ticket=OrderSend(Symbol(),OP_SELL,lot,NormalizeDouble(Bid,Digits),slip,0,0,"",magic,0,clrRed);
         if(ticket!=-1) 
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))  
              {
               OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+sl*Point,Digits),NormalizeDouble(OrderOpenPrice()-tp*Point,Digits),0,clrRed);
              }
           }
         i++;
        }
     }
  }  
//+------------------------------------------------------------------+

Vielleicht kann sie verwendet werden, aber ich verstehe die Bedeutung von Zeichenketten nicht. Kann dieser Code verwendet werden, wenn er für meine Bedingungen umgeschrieben wird?

 
Seric29:

Können Sie mir sagen, wie man in den Code des Expert Advisor zu schreiben, um 3 Trades auf einmal mit der Fähigkeit, SL setzen zu öffnen?

Hier ist mein Zustand

Mir wurde geraten, die Funktion (OrdersTotal()) zu verwenden, aber das passt in meinem Fall nicht. Bei mir sieht es so aus

Es kompiliert gut, keine Fehler, aber es ist nicht geeignet für meinen Fall.

Ich habe den folgenden Code gefunden

Vielleicht kann sie verwendet werden, aber ich verstehe die Bedeutung von Zeichenketten nicht. Kann ich diesen Code verwenden, wenn ich ihn für meine Bedingungen umschreibe?

Versuchen Sie es auf diese Weise

pos=0; //Ordnungszähler

for(int i=OrdersTotal()-1;i>=0;i--) //Marktaufträge lesen

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;//aus den Marktaufträgen auswählen

{

if (OrderSymbol()!=Symbol()&&OrderMagicNumber()!=Magic) continue;//nur EA-Aufträge auswählen (wenn Magic vorhanden ist und mit einem beliebigen Währungspaar gehandelt wird)

pos++; //wenn wir ausgewählt haben, dann erhöhen wir pos um eins

}

}

 if(MA_1>MA_2&&pos<3)
 OrderSend(_Symbol(),OP_BUY,Lots,Ask,0,Ask-SL*Point,Ask+TP*Point,NULL,Magic,0,clrGreen);
 if(MA_1<MA_2&&pos<3)
 OrderSend(_Symbol(),OP_SELL,Lots,Bid,0,Bid+SL*Point,Bid-TP*Point,NULL,Magic,0,clrRed);

 
Ein sehr interessantes Forum mit vielen aufschlussreichen Informationen :)
 
Seric29:

Können Sie mir sagen, wie man in den Code des EA zu schreiben, um 3 Trades auf einmal mit der Fähigkeit, SL setzen zu öffnen?

if(MA_1>MA_2)
     for(int i=0; i<3; i++)
          tiket = OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-(i==0?SL_1:i==1?SL_2:SL_3)*Point,Bid+TP*Point,NULL,0,0,clrGreen);
if(MA_1<MA_2)
     for(int i=0; i<3; i++)
          tiket = OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+(i==0?SL_1:i==1?SL_2:SL_3)*Point,Ask-TP*Point,NULL,0,0,clrRed);
Grund der Beschwerde: