[WARNUNG GESCHLOSSEN!] Alle Fragen von Neulingen, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen. - Seite 285

 
rid >> :

Vielleicht kann die Funktion https://www.mql5.com/ru/forum/107476/page21 helfen.

Funktion isCloseLastPosByTake().
Diese Funktion gibt ein Flag zurück, um die letzte Position auf dem Take zu schließen.

Flagge oben - Wahr - TakeProfit wurde ausgelöst.

Flagge gesenkt - Falsch - Position wurde aus einem anderen Grund geschlossen.


Die Funktion selbst sollte ganz am Ende des Codes platziert werden. Ich füge auch die Bedingung hinzu, zu verkaufen:


Ihnen allen einen guten Tag, Abend oder Morgen.

Ich habe alles so gemacht, wie ich es geschrieben habe. Ich habe die Funktion ganz am Ende des Codes eingefügt und sie den Verkaufsbedingungen hinzugefügt.

if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {//продаем

Ich habe gerade daran gedacht und es zum Kauf hinzugefügt. Die Aufträge werden nicht nur von BUY, sondern auch von SHELL geschlossen.

Ich habe die Funktion isCloseLasPosByTake() am Ende eingefügt.

2;116;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;104:33;'(' - function definition unexpected
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;109:7;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;109:14;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;112:27;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;112:33;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;114:15;'op' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;114:37;'op' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;115:17;'mn' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;115:46;'mn' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;116:19;'t' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;117:17;'t' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;127:19;'sy' - variable not defined

Hier ist eine solche Torte, oder wie man sagt, ein Ölgemälde von Pfc Gotsman. helfen Sie dem Dummy aus.... wissen nichts.......

der Code selbst (d. h. nur der Anfang)

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
    // Узнаем уровень стопов и спрэд
    int Spread = MarketInfo(Symbol(), MODE_SPREAD);
    int StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL);

    // Рассчитываем значения средних на 0-ом и 1-ом барах
    double MAF_0 = iMA(NULL, 0, MAFP, 0, 1, 1, 0);
    double MAF_1 = iMA(NULL, 0, MAFP, 0, 1, 1, 1);
    double MAS_0 = iMA(NULL, 0, MASP, 0, 1, 1, 0);
    double MAS_1 = iMA(NULL, 0, MASP, 0, 1, 1, 1);
    
    // открытие позиции Buy покупка
    if( MAF_1 < MAS_1 && MAF_0 > MAS_0)
    if( isCloseLastPosByTake( NULL, OP_SELL, MagicNumber) ==true) {//покупаем
     if( CheckOrders(OP_SELL))
      {
       if( StopLoss <= StopLevel+ Spread)
         double SL = 0;
        else
         SL = Ask - StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         double TP = 0;
        else
         TP = Ask + TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_BUY, Lots, Ask, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Buy. Ошибка №", GetLastError()); 
       }
    
    // Открытие позиции Sell продажа  
    if( MAF_1 > MAS_1 && MAF_0 < MAS_0)
    if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {//продаем
     if( CheckOrders(OP_BUY))
      {
       if( StopLoss <= StopLevel+ Spread)
         SL = 0;
        else
         SL = Bid + StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         TP = 0;
        else
         TP = Bid - TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Sell. Ошибка №", GetLastError()); 
       }
       bool isCloseLastPosByTake(string sy=NULL, int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()== sy || sy==NULL) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) {
            if ( mn<0 || OrderMagicNumber()== mn) {
              if ( t<OrderCloseTime()) {
                t=OrderCloseTime();
                j= i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect( j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo( sy, MODE_DIGITS);
    if ( dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if ( ocp== otp) return( True);
  }
  return( False);
}
//----
   return(0);
  }//+------------------------------------------------------------------+
 
igrok2008 >> :


Ich habe in meinem Beitrag ausdrücklich geschrieben. Dass diese Funktion isCloseLastPosByTake() - ganz am Ende des Codes stehen muss, VOR der START FUNCTION!

Und wo haben Sie es hingelegt?

Und achten Sie mehr auf geschweifte Klammern in Kauf- und Verkaufsbedingungen. Dort fehlen sie eindeutig (prüfen Sie, ob die Anzahl der offenen Klammern gleich der Anzahl der geschlossenen Klammern ist). Hier wurde der Verkauf korrigiert:

    //  ----- Открытие позиции Sell продажа------------  
    if( MAF_1 > MAS_1 && MAF_0 < MAS_0)                         {
    if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {
     if( CheckOrders(OP_BUY))                                     {
       if( StopLoss <= StopLevel+ Spread)
         SL = 0;        else         SL = Bid + StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         TP = 0;        else         TP = Bid - TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Sell. Ошибка №", GetLastError()); 
                 }
                }
               }
      //---конец блока продажи ------------------------------
 

Guten Tag!!!


Ich brauche Hilfe! Ich entschuldige mich dafür, dass ich nicht bescheiden bin.

Aber hier ist mein Problem, ich habe eine EA, die auf einem Martin basiert, es platziert die erste Bestellung SELL oder BUY, was auch immer ich will, aber ich möchte in der Lage sein, BUY oder SELL in EA Eigenschaften zu wählen. D.h. ich gebe z.B. BUY in die Eigenschaften ein und es wird eine BUY only Order eröffnet, oder das Gegenteil.

Ich fürchte, ich habe noch nicht gelernt, wie man in MQL4 programmiert.


Ich füge den Ratgeber selbst bei.


Vielen Dank im Voraus an diejenigen, die antworten werden!

 
rid >> :

Ich habe in meinem Beitrag ausdrücklich geschrieben. Dass diese Funktion isCloseLastPosByTake() - ganz am Ende des Codes stehen muss, VOR der START FUNCTION!

Und wo haben Sie es hingelegt?

Und achten Sie mehr auf geschweifte Klammern in Kauf- und Verkaufsbedingungen. Dort fehlen sie eindeutig (prüfen Sie, ob die Anzahl der offenen Klammern gleich der Anzahl der geschlossenen Klammern ist). Hier ist eine Lösung für den Verkauf:


Ich habe es nach dem Start fi, ich verstehe.....

Dann habe ich es falsch verstanden, danke für den Hinweis :-))

Wenn ich es richtig verstanden habe, sollte es nach } am Ende des Experten-Deinitialisierungsfunktionsblocks ??????? oder nach return(0); am Ende von start-??????? eingefügt werden.

Vielen Dank im Voraus für Ihre Geduld!!!!!!!!!

 
igrok2008 >> :

Ich habe sie nach der Startfunktion eingefügt, so dass ich verstehe.....

Ich habe es falsch verstanden, danke für den Hinweis :-))

Wenn ich es richtig verstanden habe, sollte es nach } am Ende des Experten-Deinitialisierungs-Funktionsblocks ??????? oder nach return(0); ganz am Ende von start-??????? eingefügt werden.

Vielen Dank im Voraus für Ihre Geduld!!!!!!!!!

Es muss im Freien aufgestellt werden. Nicht innerhalb einer Funktion, sondern als separate, unabhängige Funktion.

Zum Beispiel so:

int start()
  {
//----
    // Узнаем уровень стопов и спрэд
    int Spread = MarketInfo(Symbol(), MODE_SPREAD);
    int StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL);

    // Рассчитываем значения средних на 0-ом и 1-ом барах
    double MAF_0 = iMA(NULL, 0, MAFP, 0, 1, 1, 0);
    double MAF_1 = iMA(NULL, 0, MAFP, 0, 1, 1, 1);
    double MAS_0 = iMA(NULL, 0, MASP, 0, 1, 1, 0);
    double MAS_1 = iMA(NULL, 0, MASP, 0, 1, 1, 1);
    
    // открытие позиции Buy покупка
    if( MAF_1 < MAS_1 && MAF_0 > MAS_0)                         {
    if( isCloseLastPosByTake( NULL, OP_SELL, MagicNumber) ==true) {
     if( CheckOrders(OP_SELL))                                      {
       if( StopLoss <= StopLevel+ Spread)
         double SL = 0;        else         SL = Ask - StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         double TP = 0;        else         TP = Ask + TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_BUY, Lots, Ask, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Buy. Ошибка №", GetLastError()); 
                }
               }
              }
//-------------------Конец покупки -----------------------

    //  ----- Открытие позиции Sell продажа------------  
    if( MAF_1 > MAS_1 && MAF_0 < MAS_0)                         {
    if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {
     if( CheckOrders(OP_BUY))                                     {
       if( StopLoss <= StopLevel+ Spread)
         SL = 0;        else         SL = Bid + StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         TP = 0;        else         TP = Bid - TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Sell. Ошибка №", GetLastError()); 
                 }
                }
               }
      //---конец блока продажи ------------------------------
    
//----
   return(0);
  }//+----------КОНЕЦ ФУНКЦИИ СТАРТ -------------------+


//ЖЖЖЖЖЖЖ Другие вызываемые пользовательские функции ЖЖЖЖЖЖ

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия           |
//|  последней позиции по тейку.                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()== sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) {
            if ( mn<0 || OrderMagicNumber()== mn) {
              if ( t<OrderCloseTime()) {
                t=OrderCloseTime();
                j= i;
              }} }}}}}

  if (OrderSelect( j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo( sy, MODE_DIGITS);
    if ( dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if ( ocp== otp) return( True);
  }
  return( False);
}


Ich bin mir nicht sicher, ob der Expert Advisor unter diesen Bedingungen funktionieren wird. Denn die allererste Stelle wird sich nicht öffnen können...

Die Funktion isCloseLastPosByTake() sollte aus einer Kauf- oder Verkaufsbedingung entfernt werden.

Dann wird der Berater arbeiten.

 
Rover82 >> :

Guten Tag!!!

Aber hier ist mein Problem, ich habe eine EA, die auf einem Martin basiert, es platziert die erste Bestellung SELL oder BUY, was auch immer ich will, aber ich möchte in der Lage sein, BUY oder SELL in EA Eigenschaften zu wählen. D.h. wenn ich z.B. BUY in die Eigenschaften eintrage, wird ein BUY only Auftrag geöffnet, oder umgekehrt.

Ich hänge den EA selbst an.

Vielen Dank im Voraus an alle, die uns antworten!


Es ist unwahrscheinlich, dass jemand darauf reagiert. Der EA ist dekompiliert (gehackt) und solche Dateien sind hier nicht willkommen...

 
WinExec("C:\\Program Files\\Opera\\opera.exe http://www.mail.ru",2);
Hallo zusammen, dies ist das Starten des Links mit einem bestimmten Browser, aber wie kann ich den gleichen Link standardmäßig starten?
 
D.h. mit dem Standardbrowser
 
Dimoncheg >> :
D.h. der Standardbrowser

ShellExecute, sozusagen der "offene" Befehl.

 

Ich habe beschlossen, MQL 4 zu studieren, da alles, was ich gefunden habe, nicht meinen Erwartungen entspricht. Im Moment studiere ich , um zu verstehen, wie Profis arbeiten, und um es für meine Idee zu verbessern. Es gibt eine (einfache und kleine, einseitige) benutzerdefinierte Funktion, der Code ist beigefügt. Aufgrund meiner Laienhaftigkeit kann ich seit zwei Tagen nicht verstehen, was diese Funktion als Ergebnis zurückgibt und welche verschachtelte Bedingung das Else ist?

Möchte jemand einen Funken Wissen in meine Dumpfheit pflanzen?

Was ich verstehe, ist Folgendes:

Der Zweck der Funktion ist es, festzustellen, ob es bereits eine Bestellung für dieses Paar gibt, und wenn ja, deren Typ zu bestimmen.

Die Funktion, die diese Funktion aufgerufen hat, wartet auf das Vorhandensein eines der in der Prozedur ausgewählten Aufträge Schalter, Die Funktion sollte "1" zurückgeben, bei Vorhandensein von zwei Aufträgen - "2", und bei Fehlen von Aufträgen "-1".

Der Zyklus wird gestartet, wenn l_pos_16= 0. Nehmen wir an, wir haben insgesamt vier ausstehende Aufträge für einige Paare, einschließlich zwei bei dem Paar, bei dem der EA arbeitet, und sie sind nicht die ersten.

Bei der ersten Iteration der Schleife wird jedoch die Funktion if(OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)) die Position mit der Nummer "0" in der Liste der Aufträge zu überprüfen, aber es gibt keine solche Position (weil ich verstehe, dass die Nummerierung von Position 1 ausgeht) und dann wird es zum nächsten übergehen. sonst mit vollständigem Ausstieg aus fCountOrders(int &a_count_0, int &a_count_4, int &a_count_8, int &a_count_12) mit Rückgabe des Wertes Rückgabe(-1).

Der Sinn der Funktion als Ganzes geht verloren, da das Ergebnis unabhängig vom Vorhandensein oder Nichtvorhandensein von Aufträgen auf dem gegebenen Symbol das gleiche sein sollte.

Wenn der EA jedoch funktioniert, definiert diese Funktion das, was die aufgerufene Funktion von ihr erwartet, die dann in Abhängigkeit von dem erhaltenen Ergebnis arbeitet .

Ich verstehe auch nicht, was sonst Return(-1) wird funktionieren in

if (OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)) {

Oder gleich in if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_N) {

Der Code der Funktion :

int fCountOrders(int &a_count_0, int &a_count_4, int &a_count_8, int &a_count_12)

a_count_0= 0;

a_count_4 = 0;

a_count_8 = 0;

a_count_12 = 0;

gi_252 = 0;

for (int l_pos_16 = 0; l_pos_16 < OrdersTotal(); l_pos_16++) {

if (OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)) {

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_N) {

switch (OrderType()) case OP_BUY:

a_count_0++;

gi_252 = 1;

g_ticket_268 = OrderTicket();

gs_272 = Bestellkommentar();

g_ord_open_price_256 = OrderOpenPrice();

g_ord_stoploss_288 = OrderStopLoss();

g_ord_takeprofit_296 = OrderTakeProfit();

Pause;

Fall OP_SELL:

a_count_4++;

gi_252 = -1;

g_ticket_268 = OrderTicket();

gs_272 = Bestellkommentar();

g_ord_open_price_256 = OrderOpenPrice();

g_ord_stoploss_288 = OrderStopLoss();

g_ord_takeprofit_296 = OrderTakeProfit();

Pause;

Fall OP_BUYSTOP:

a_count_8++;

Pause;

Fall OP_SELLSTOP:

a_count_12++;

}

}

} else return (-1);

}

return (a_count_0 + a_count_4 + a_count_8 + a_count_12);

/* Bei normaler Ausführung von f-i wird in der Variablen in einem der folgenden Fälle eine Eins zurückgegeben Fall und "0" in allen anderen, was anzeigt, dass es eine der folgenden Möglichkeiten gibt

der Auftragsarten, und die Nummer dieses Auftrags ist für die aufrufende Funktion verfügbar,

Kommentar, Eröffnungskurs, Stop Loss und Take Profit */

}