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

 

Hallo!

Bitte prüfen Sie, wo ich einen Fehler gemacht habe (es will nicht funktionieren)

Ich möchte, dass das Kaufsignal um dieAbweichung * _Point (in den Einstellungen festgelegt) verschoben wirdif(GetLotSize()>LotControl)

LotControl - ebenfalls in den Einstellungen festgelegt

GetLotSize() - wie empfohlen:

double GetLotSize()
  {
   double Ls=0;
   datetime last = 0, openTime;
   for (int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
           {
             if(OrderType() == OP_BUY || OrderType() == OP_SELL) {
               if ((openTime = OrderOpenTime()) > last) {
                 last = openTime;
                 Ls = OrderLots();
               }
             }
           }
        }
     }
   return Ls;
  }
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
 {

  if(GetLotSize()>LotControl)  {openPrice = dMA + deviation * _Point;}
   
  else 
  openPrice = dMA;
   //Если появился сигнал на покупку, то откроем ордер на покупку
   if(bSignalBuy() == true)
   vOrderOpenBuy();
   
// Если появился сигнал на продажу, то откроем ордер на продажу
   if(bSignalSell() == true)
   vOrderOpenSell();
  
     }
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfit

 // if(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)
 //    {
// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка
 //     CloseOrder();
 //    }
DrawLABEL("lab_Take",1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2),AC));
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция проверки открытых оредров |
//+-----------------------------------------------------------------------------------------------+
int CountOrders() 
  {
   int cnt=0;
   int i=OrdersTotal()-1;
   for(int pos=i;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol)
           {
            if(OrderMagicNumber()==Magic) cnt++;
           }
        }
     }
   return(cnt);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на покупку |
//+-----------------------------------------------------------------------------------------------+
bool bSignalBuy()
  {
   if (openPrice > Open[1] && openPrice < Close[1]) //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика.
   
  return(true);
   
  return(false);
  }
 
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на продажу |
//+-----------------------------------------------------------------------------------------------+
bool bSignalSell()
   
  {
   if(openPrice< Open[1] && openPrice > Close[1])

   return(true);

   return(false);
  }

 
законопослушный гражданин #:

Danke. Aus irgendeinem Grund hatte es keine Wirkung.

//+----------------------------------------------------------------------------+
if(bSignalBuy())
  {
   if(GetLotSize()>LotControl) vOrderOpenSell();
   else vOrderOpenBuy();
  }
//+----------------------------------------------------------------------------+
double GetLotSize()
  {
   double Ls=0;
   datetime t=0;
   int i=OrdersHistoryTotal();
   for(int pos=0; pos<i; pos++)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(t<OrderCloseTime()) {t=OrderCloseTime(); Ls=OrderLots();}
              }
           }
        }
     }
   return Ls;
  }
//+----------------------------------------------------------------------------+
 
законопослушный гражданин #:

Danke. Aus irgendeinem Grund hat es keine Wirkung gezeigt.

Ich schrieb:

if (bSignalBuy()) {
  if (GetLotSize() > LotControl)
    vOrderOpenSell();
  else
    vOrderOpenBuy();
}

Eröffnet aber dennoch zwei unterschiedlich ausgerichtete Positionen auf denselben Tick? Das kann nicht richtig sein!

double GetLotSize()
  {
   double Ls=0;
   datetime last = 0, openTime;
   for (int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
           {
             if(OrderType() == OP_BUY || OrderType() == OP_SELL) {
               if ((openTime = OrderOpenTime()) > last) {
                 last = openTime;
                 Ls = OrderLots();
               }
             }
           }
        }
     }
   return Ls;
  }

Was diesen Code betrifft, so kann es durchaus sein, dass sich nichts geändert hat. Da die Aufträge in der abschließenden Reihenfolge ausgeführt werden.

Sortieren Sie Ihren Algorithmus so gut wie möglich aus.

void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
 {

  if(GetLotSize()>LotControl)  {openPrice = dMA + deviation * _Point;}
   
  else 
  openPrice = dMA;
   //Если появился сигнал на покупку, то откроем ордер на покупку
   if(bSignalBuy() == true)
   vOrderOpenBuy();
   
// Если появился сигнал на продажу, то откроем ордер на продажу
   if(bSignalSell() == true)
   vOrderOpenSell();
  
     }
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfit

 // if(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)
 //    {
// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка
 //     CloseOrder();
 //    }
DrawLABEL("lab_Take",1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2),AC));
  }

Sie sollten Ihren Algorithmus überprüfen: Hier geben Sie nur die Kauf- und Verkaufssignale ein und nichts weiter. Was darf hier nicht funktionieren? Keine Eintrittsfunktionen, keine Marktaustrittsfunktionen...

 

Forum für Handel, automatisierte Handelssysteme und Strategietests

Alle Fragen von Neulingen zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes

MakarFX, 2021.12.02 18:30

//+----------------------------------------------------------------------------+
if(bSignalBuy())
  {
   if(GetLotSize()>LotControl) vOrderOpenSell();
   else vOrderOpenBuy();
  }
//+----------------------------------------------------------------------------+
double GetLotSize()
  {
   double Ls=0;
   datetime t=0;
   int i=OrdersHistoryTotal();
   for(int pos=0; pos<i; pos++)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(t<OrderCloseTime()) {t=OrderCloseTime(); Ls=OrderLots();}
              }
           }
        }
     }
   return Ls;
  }
//+----------------------------------------------------------------------------+

Was ist hier drin? Sie haben im Wesentlichen nichts verändert. Sie haben gerade weitere Aufrufe von OrderCloseTime gemacht. Der Code wurde in eine einzige Zeile gestreckt. Und sie wurde weniger lesbar. Aber das Ergebnis ist immer noch dasselbe.

 
Mihail Matkovskij #:

Wie wäre es mit hier? Sie haben im Wesentlichen nichts verändert. Sie haben gerade weitere Aufrufe von OrderCloseTime gemacht. Das Ergebnis ist jedoch das gleiche.

Öffnen Sie die Augen
 
MakarFX #:
Öffne deine Augen

Argumente im Studio, bitte

 
Mihail Matkovskij #:

Streitereien im Studio, bitte.

Öffne jetzt deine Augen

 
Mihail Matkovskij #:

Wie wäre es mit hier? Sie haben im Wesentlichen nichts verändert. Sie haben gerade weitere Aufrufe von OrderCloseTime gemacht. Und wir haben den Code in eine einzige Zeile gestreckt. Und sie wurde weniger lesbar. Das Ergebnis ist jedoch das gleiche.

Soweit ich das beurteilen kann, besteht der Unterschied in den folgenden Punkten:

double GetLotSize()
  {
   double Ls=0;
   datetime last = 0, openTime;
   for (int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
           {
             if(OrderType() == OP_BUY || OrderType() == OP_SELL) {
               if ((openTime = OrderOpenTime()) > last) {
                 last = openTime;
                 Ls = OrderLots();
               }
             }
           }
        }
     }
   return Ls;
  }



double GetLotSize()
  {
   double Ls=0;
   datetime t=0;
   int i=OrdersHistoryTotal();
   for(int pos=0; pos<i; pos++)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(t<OrderCloseTime()) {t=OrderCloseTime(); Ls=OrderLots();}
              }
           }
        }
     }
   return Ls;
  }
мне как то объясняли, что один вариант считает с конца списка, а второй с начала.
 
MakarFX #:

Öffnen Sie jetzt Ihre Augen.

(seufzt) Okay. Ich habe diesen Moment verpasst. Ich gebe es zu.

 
законопослушный гражданин #:

Soweit ich sehen kann, ist der Unterschied wie folgt:

double GetLotSize()
  {
   double Ls=0;
   datetime last = 0, openTime;
   for (int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
           {
             if(OrderType() == OP_BUY || OrderType() == OP_SELL) {
               if ((openTime = OrderOpenTime()) > last) {
                 last = openTime;
                 Ls = OrderLots();
               }
             }
           }
        }
     }
   return Ls;
  }




double GetLotSize()
  {
   double Ls=0;
   datetime t=0;
   int i=OrdersHistoryTotal();
   for(int pos=0; pos<i; pos++)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(t<OrderCloseTime()) {t=OrderCloseTime(); Ls=OrderLots();}
              }
           }
        }
     }
   return Ls;
  }
Grund der Beschwerde: