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

 
Andrey Sokolov:

Ich verstehe. Danke. Hat sonst noch jemand einen Tipp?

Ich habe auch bei Ihnen gelernt.

Mittelpuffer

//+------------------------------------------------------------------+
//|                                                  Demo_iBands.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

//--- входные параметры
input int                  bands_period=20;           // период скользящей средней
input int                  bands_shift=0;             // сдвиг
input double               deviation=2.0;             // кол-во стандартных отклонений
input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE; // тип цены
//--- переменная для хранения хэндла индикатора iBands
int    handle;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- создадим хэндл индикатора
   handle=iBands(_Symbol,_Period,bands_period,bands_shift,deviation,applied_price);
//--- если не удалось создать хэндл
   if(handle==INVALID_HANDLE)
     {
      //--- сообщим о неудаче и выведем номер ошибки
      PrintFormat("Не удалось создать хэндл индикатора iBands для пары %s/%s, код ошибки %d",
                  _Symbol,
                  EnumToString(_Period),
                  GetLastError());
      //--- работа индикатора завершается досрочно
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(handle!=INVALID_HANDLE)
      IndicatorRelease(handle);
//--- почистим график при удалении индикатора
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- индикаторные буферы
   double         UpperBuffer[];
   double         LowerBuffer[];
   double         MiddleBuffer[];
//--- количество копируемых значений из индикатора iBands
   int values_to_copy=2;
//--- если FillArraysFromBuffer вернула false, значит данные не готовы - завершаем работу
   if(!FillArraysFromBuffers(MiddleBuffer,UpperBuffer,LowerBuffer,bands_shift,handle,values_to_copy))
      return;
//--- сформируем сообщение
   Print("MiddleBuffer =",MiddleBuffer[0], "UpperBuffer =",UpperBuffer[0], "LowerBuffer =",LowerBuffer[0], "values_to_copy =",values_to_copy);
  }
//+------------------------------------------------------------------+
//| Заполняем индикаторные буферы из индикатора iBands               |
//+------------------------------------------------------------------+
bool FillArraysFromBuffers(double &base_values[],     // индикаторный буфер средней линии Bollinger Bands
                           double &upper_values[],    // индикаторный буфер верхней границы
                           double &lower_values[],    // индикаторный буфер нижней границы
                           int shift,                 // смещение
                           int ind_handle,            // хэндл индикатора iBands
                           int amount                 // количество копируемых значений
                          )
  {
//--- сбросим код ошибки
   ResetLastError();
//--- заполняем часть массива MiddleBuffer значениями из индикаторного буфера под индексом 0
   if(CopyBuffer(ind_handle,0,-shift,amount,base_values)<0)
     {
      //--- если копирование не удалось, сообщим код ошибки
      PrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
      //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным
      return(false);
     }
//--- заполняем часть массива UpperBuffer значениями из индикаторного буфера под индексом 1
   if(CopyBuffer(ind_handle,1,-shift,amount,upper_values)<0)
     {
      //--- если копирование не удалось, сообщим код ошибки
      PrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
      //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным
      return(false);
     }
//--- заполняем часть массива LowerBuffer значениями из индикаторного буфера под индексом 2
   if(CopyBuffer(ind_handle,2,-shift,amount,lower_values)<0)
     {
      //--- если копирование не удалось, сообщим код ошибки
      PrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
      //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным
      return(false);
     }
//--- все получилось
   return(true);
  }
//+------------------------------------------------------------------+
 
Jungs, wer ist nicht beschäftigt und kann einen Blick zu nehmen. skizziert eine EA auf gestrigen Indikator, aber etwas ist nicht richtig funktioniert. Es scheint, als würde es Geschäfte eröffnen, die nicht auf Signalen basieren. Ich habe versucht, Abschlussaufträge auf das entgegengesetzte Signal hinzuzufügen, aber die Geschäfte werden dann nicht geschlossen. Ich habe eine Ahnung, ob es einen Fehler in der Bedingung gibt.
input int Magic = 000;
input double Lots = 0.1;
input int TakeProfit = 100;
input int StopLoss = 50;
input int Slippage = 5;

double vverh,vnuz,SL,TP;
int tiket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  /* if (Digits == 3 || Digits == 5)
   {
      TakeProfit *=10;
      StopLoss *=10;
      Slippage *=10;
   }*/
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
           
     
      vverh = iCustom(NULL,0,"777",0,1); // стрелка вверх
      vnuz = iCustom(NULL,0,"777",1,1); // стрелка вниз
      
     //-----------------------------------------------------------
     if (CountSell() == 0 && vnuz >0)
      {
      tiket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0, Red);
      if (tiket>0)
         {
         SL=NormalizeDouble(Bid+StopLoss*Point,Digits);
         TP=NormalizeDouble(Bid-TakeProfit*Point,Digits);
         if (OrderSelect(tiket, SELECT_BY_TICKET))
            if (!OrderModify(tiket,OrderOpenPrice(),SL,TP,0))
               Print("Ошибка модификации ордера на продажу");
         } else Print("Ошибка открытия ордера на продажу");
      }
      
      ////////////////////////////////////////////////////////////////
    if (CountBuy() == 0 && vverh >0)
      {
      tiket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue);
      if (tiket>0)
         {
         TP=NormalizeDouble(Ask+TakeProfit*Point,Digits);
         SL=NormalizeDouble(Ask-StopLoss*Point,Digits);
         if (OrderSelect(tiket, SELECT_BY_TICKET))
           if (!OrderModify(tiket,OrderOpenPrice(),SL,TP,0))
           Print("Ошибка модификации ордера на покупку");
         } else Print("Ошибка открытия ордера на покупку");
      }  
     
      
  }
//+------------------------------------------------------------------+
int CountSell()
{
   int count =0;
   for (int trade = OrdersTotal()-1; trade>=0; trade--)
   {
   if (OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
      {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType() == OP_SELL)
         count++;
      }
   }
   return(count);
}
//+------------------------------------------------------------------+
int CountBuy()
{
   int count =0;
   for (int trade = OrdersTotal()-1; trade>=0; trade--)
   {
   if (OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
      {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
         count++;
      }
   }
   return(count);
}
Dateien:
 
PapaYozh:

Seien Sie nur nicht überrascht, wenn es nicht mehroder nur noch sporadisch funktioniert.

Aus welchem Grund? Warum sagst du uns nicht, was los ist?

 
Andrey Sokolov:

Aus welchem Grund? Warum sagst du nicht, was los ist?

Was soll die ganze Schikane?

 
PapaYozh:

Was hat es mit der Fahrerflucht auf sich?

Ich verstehe.

Kann mir noch jemand sagen, was damit nicht stimmt und warum es nicht mehr funktioniert, wenn tatsächlich etwas nicht stimmt?

 
Andrey Sokolov:

Ich verstehe.

Vielleicht kann mir jemand anderes sagen, was da nicht stimmt, und aus welchem Grund es nicht mehr funktioniert, wenn wirklich etwas nicht stimmt?

Hier ist die Antwort

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

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

Igor Makanu, 2021.07.05 14:16.

weil der Indikator noch nicht berechnet ist.

https://www.mql5.com/ru/docs/series/barscalculated


der OnInit()-Abschnitt ist nicht der beste Ort, um die Terminalumgebung zu erhalten, ich denke, es funktioniert logisch und korrekt

 
Alexey Viktorov:
Hier ist die Antwort.

Ich danke Ihnen.

Ich möchte, dass die Verlaufsberechnungen sofort beim Start durchgeführt werden. Ich tue es vor Ort, weil ich es so brauche.

Ich habe eine Pause vor den Berechnungen eingefügt. Wenn ja, gibt es immer noch einige Fallstricke?

 
Andrey Sokolov:

Es ist notwendig, bei der Inbetriebnahme Berechnungen zur Historie durchzuführen. Ich mache es im Haus, weil ich es so brauche.

Ich habe in der Einleitung eine Pause eingefügt, bevor ich rechne. Wenn ja, gibt es noch einige Fallstricke?

Es ist einfacher und zuverlässiger, das erste Startflag in OnTick() zu setzen

 
jarikn:
Leute, wer ist nicht beschäftigt und kann schauen. skizziert eine EA auf den gestrigen Indikator, aber etwas funktioniert nicht richtig. Es scheint, als würde es Geschäfte eröffnen, die nicht auf Signalen basieren. Ich habe versucht, Abschlussaufträge auf das entgegengesetzte Signal hinzuzufügen, aber die Geschäfte werden dann nicht geschlossen. Ich glaube, ich vermisse es.
Höchstwahrscheinlich zeichnet der Indikator ... und suchen Sie nach Fehlern im Protokoll
 
Andrey Sokolov:

Aus welchem Grund? Warum schreibst du nicht, was los ist?

Weil die Entwickler geschrieben haben, dass OnInit() für die Initialisierung gedacht ist und nicht für etwas anderes

Was wird passieren - Sie haben eine Pause gemacht, um die Indikatorwerte in OnInit() zu erhalten - was wird passieren, wenn der Benutzer die TF zur gleichen Zeit wechselt?

SZZY: Und wie würde sich Ihr Code verhalten, wenn Sie einen EA ausführen, dann das Terminal schließen und das Terminal mit einem laufenden EA wieder öffnen?