Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 5

 
Vladymyr Glushko:
Ma come fare passo dopo passo? ..... oggetti grafici (cosa sono e come metterli), mettere etichette di dati sul grafico (dove inserire e con quali dati) ...... scusate le domande stupide.

Software.

Dovete scrivere un indicatore informativo con i dati che volete.

 
strongflex:
Poi, se RSI ha attraversato il livello 20 minuti fa, controlliamo il prezzo, cioè per andare short il prezzo deve essere più basso di 20 minuti fa. Grazie mille. Se funziona, ti devo una promessa))

Dato che lo creiamo al massimo vicino a MQL5, non useremo le funzioni MQL4 per ottenere lo spostamento delle barre in base al tempo e il prezzo di chiusura (iBarShift() e iClose() rispettivamente).

Abbiamo le nostre funzioni per questo: GetBarShift() e GetPriceClose(). Inoltre, dovremo ottenere l'ora della barra usando la funzione GetTime() invece di iTime(), dato che rifiutiamo le funzioni standard MQL4.

Ecco un Expert Advisor di prova:

//+------------------------------------------------------------------+
//|                                               exTestValueRSI.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
//--- input parameters
input ENUM_TIMEFRAMES      TimeframeRSI   = PERIOD_M15;  // Таймфрейм RSI
input int                  PeriodRSI      = 14;          // Период расчёта RSI
input ENUM_APPLIED_PRICE   PriceRSI       = PRICE_CLOSE; // Цена расчёта RSI
input int                  MinutesBefore  =20;           // Количество минут назад
//--- global variables
int      minutesBefore;    // Количество минут назад
int      periodRSI;        // Период расчёта RSI
//---
double   prevRSIvalue0;    // Значение RSI для заданного тф xxx минут назад
double   prevRSIvalue1;    // Значение RSI для заданного тф xxx минут назад-x минут
//---
double   prevClose_0;      // Значение Close для заданного тф xxx минут назад
double   prevClose_1;      // Значение Close для заданного тф xxx минут назад-x минут
//---
datetime timeBefore;       // Время ххх минут назад
datetime timePrevBefore;   // Время ххх минут назад-x минут
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   minutesBefore=(MinutesBefore<1?1:MinutesBefore);  // Количество минут назад
   periodRSI=(PeriodRSI<1?1:PeriodRSI);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int shift_0;
   int shift_1;
   //---
   MqlDateTime server_time;
   TimeToStruct(TimeCurrent(),server_time);
   string tf=EnumToString(TimeframeRSI);
   //--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0
   if(server_time.min%minutesBefore==0 || server_time.min==0) {
      //--- время 1x и 2x минут назад
      timeBefore=TimeCurrent()-minutesBefore*PeriodSeconds(PERIOD_M1);
      timePrevBefore=TimeCurrent()-2*minutesBefore*PeriodSeconds(PERIOD_M1);
      //--- смещение в барах времени 1х и 2х для заданного таймфрейма RSI (тф М15)
      shift_0=GetBarShift(Symbol(),TimeframeRSI,timeBefore);
      shift_1=GetBarShift(Symbol(),TimeframeRSI,timePrevBefore);
      //--- значения RSI на барах 1х и 2х минут назад для заданного таймфрейма RSI (тф М15)
      prevRSIvalue0=GetLastDataRSI(Symbol(),TimeframeRSI,shift_0);
      prevRSIvalue1=GetLastDataRSI(Symbol(),TimeframeRSI,shift_1);
      //--- значения цен закрытия баров 1х и 2х минут назад
      prevClose_0=GetPriceClose(Symbol(),TimeframeRSI,shift_0);
      prevClose_1=GetPriceClose(Symbol(),TimeframeRSI,shift_1);
      }
   Comment("\nТекущее время: ",TimeCurrent(),
          "\nВремя ",minutesBefore," минут назад: ",TimeCurrent()-minutesBefore*PeriodSeconds(PERIOD_M1),
          "\nБар ",tf,"_0=",shift_0,", бар ",tf,"_1=",shift_1,
          "\nМинуты текущего времени: ",server_time.min,
          "\nЗначение RSI ",minutesBefore," минут назад на ",tf," : ",DoubleToString(prevRSIvalue0,4),
          "\nЗначение RSI ",minutesBefore*2," минут назад на ",tf," : ",DoubleToString(prevRSIvalue1,4),
          //---
          "\nЗначение Close ",minutesBefore," минут назад > ",tf," : ",DoubleToString(prevClose_0,Digits()),
          "\nЗначение Close ",minutesBefore*2," минут назад > ",tf," : ",DoubleToString(prevClose_1,Digits())
          );
  }
//+------------------------------------------------------------------+
double GetLastDataRSI(string symbol_name, ENUM_TIMEFRAMES timeframe, int shift, int period_rsi=14, ENUM_APPLIED_PRICE price_rsi=PRICE_CLOSE) {
   return(iRSI(symbol_name,timeframe,period_rsi,price_rsi,shift));
}
//+------------------------------------------------------------------+
double GetPriceClose(string symbol_name,ENUM_TIMEFRAMES timeframe, int shift){
   double array[1];
   if(CopyClose(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
   return(-1);
}
//+------------------------------------------------------------------+
int GetBarShift(string symbol_name,ENUM_TIMEFRAMES timeframe,datetime time) {
   if(time<0) return(-1);
   //---
   datetime array[], time0;
   if(CopyTime(symbol_name,timeframe,0,1,array)<0) return(-1);
   time0=array[0];
   if(CopyTime(symbol_name,timeframe,time0,time,array)<0) return(-1);
   datetime temptime=GetTime(symbol_name,timeframe,ArraySize(array)-1);
   if(array[0]==temptime && temptime<=time) return(ArraySize(array)-1);
   else return(ArraySize(array));
}
//+------------------------------------------------------------------+
datetime GetTime(string symbol_name,ENUM_TIMEFRAMES timeframe,int bar) {
   if(bar<0) return(-1);
   datetime array[];
   if(CopyTime(symbol_name,timeframe,bar,1,array)>0) return(array[0]);
   return(-1);
}
//+------------------------------------------------------------------+

Ora dobbiamo fare una funzione separata per ricevere i dati RSI per il tempo richiesto e confrontare i prezzi e i valori RSI

 
Artyom Trishkin:

Dato che lo creiamo al massimo vicino a MQL5, non useremo le funzioni MQL4 per ottenere lo spostamento delle barre in base al tempo e il prezzo di chiusura (iBarShift() e iClose() rispettivamente).

Abbiamo le nostre funzioni per questo: GetBarShift() e GetPriceClose(). Inoltre, dovremo ottenere l'ora della barra usando la funzione GetTime() invece di iTime(), dato che rifiutiamo le funzioni standard MQL4.

Ecco un Expert Advisor di prova:

//+------------------------------------------------------------------+
//|                                               exTestValueRSI.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
//--- input parameters
input ENUM_TIMEFRAMES      TimeframeRSI   = PERIOD_M15;  // Таймфрейм RSI
input int                  PeriodRSI      = 14;          // Период расчёта RSI
input ENUM_APPLIED_PRICE   PriceRSI       = PRICE_CLOSE; // Цена расчёта RSI
input int                  MinutesBefore  =20;           // Количество минут назад
//--- global variables
int      minutesBefore;    // Количество минут назад
int      periodRSI;        // Период расчёта RSI
//---
double   prevRSIvalue0;    // Значение RSI для заданного тф xxx минут назад
double   prevRSIvalue1;    // Значение RSI для заданного тф xxx минут назад-x минут
//---
double   prevClose_0;      // Значение Close для заданного тф xxx минут назад
double   prevClose_1;      // Значение Close для заданного тф xxx минут назад-x минут
//---
datetime timeBefore;       // Время ххх минут назад
datetime timePrevBefore;   // Время ххх минут назад-x минут
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   minutesBefore=(MinutesBefore<1?1:MinutesBefore);  // Количество минут назад
   periodRSI=(PeriodRSI<1?1:PeriodRSI);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int shift_0;
   int shift_1;
   //---
   MqlDateTime server_time;
   TimeToStruct(TimeCurrent(),server_time);
   string tf=EnumToString(TimeframeRSI);
   //--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0
   if(server_time.min%minutesBefore==0 || server_time.min==0) {
      //--- время 1x и 2x минут назад
      timeBefore=TimeCurrent()-minutesBefore*PeriodSeconds(PERIOD_M1);
      timePrevBefore=TimeCurrent()-2*minutesBefore*PeriodSeconds(PERIOD_M1);
      //--- смещение в барах времени 1х и 2х для заданного таймфрейма RSI (тф М15)
      shift_0=GetBarShift(Symbol(),TimeframeRSI,timeBefore);
      shift_1=GetBarShift(Symbol(),TimeframeRSI,timePrevBefore);
      //--- значения RSI на барах 1х и 2х минут назад для заданного таймфрейма RSI (тф М15)
      prevRSIvalue0=GetLastDataRSI(Symbol(),TimeframeRSI,shift_0);
      prevRSIvalue1=GetLastDataRSI(Symbol(),TimeframeRSI,shift_1);
      //--- значения цен закрытия баров 1х и 2х минут назад
      prevClose_0=GetPriceClose(Symbol(),TimeframeRSI,shift_0);
      prevClose_1=GetPriceClose(Symbol(),TimeframeRSI,shift_1);
      }
   Comment("\nТекущее время: ",TimeCurrent(),
          "\nВремя ",minutesBefore," минут назад: ",TimeCurrent()-minutesBefore*PeriodSeconds(PERIOD_M1),
          "\nБар ",tf,"_0=",shift_0,", бар ",tf,"_1=",shift_1,
          "\nМинуты текущего времени: ",server_time.min,
          "\nЗначение RSI ",minutesBefore," минут назад на ",tf," : ",DoubleToString(prevRSIvalue0,4),
          "\nЗначение RSI ",minutesBefore*2," минут назад на ",tf," : ",DoubleToString(prevRSIvalue1,4),
          //---
          "\nЗначение Close ",minutesBefore," минут назад > ",tf," : ",DoubleToString(prevClose_0,Digits()),
          "\nЗначение Close ",minutesBefore*2," минут назад > ",tf," : ",DoubleToString(prevClose_1,Digits())
          );
  }
//+------------------------------------------------------------------+
double GetLastDataRSI(string symbol_name, ENUM_TIMEFRAMES timeframe, int shift, int period_rsi=14, ENUM_APPLIED_PRICE price_rsi=PRICE_CLOSE) {
   return(iRSI(symbol_name,timeframe,period_rsi,price_rsi,shift));
}
//+------------------------------------------------------------------+
double GetPriceClose(string symbol_name,ENUM_TIMEFRAMES timeframe, int shift){
   double array[1];
   if(CopyClose(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
   return(-1);
}
//+------------------------------------------------------------------+
int GetBarShift(string symbol_name,ENUM_TIMEFRAMES timeframe,datetime time) {
   if(time<0) return(-1);
   //---
   datetime array[], time0;
   if(CopyTime(symbol_name,timeframe,0,1,array)<0) return(-1);
   time0=array[0];
   if(CopyTime(symbol_name,timeframe,time0,time,array)<0) return(-1);
   datetime temptime=GetTime(symbol_name,timeframe,ArraySize(array)-1);
   if(array[0]==temptime && temptime<=time) return(ArraySize(array)-1);
   else return(ArraySize(array));
}
//+------------------------------------------------------------------+
datetime GetTime(string symbol_name,ENUM_TIMEFRAMES timeframe,int bar) {
   if(bar<0) return(-1);
   datetime array[];
   if(CopyTime(symbol_name,timeframe,bar,1,array)>0) return(array[0]);
   return(-1);
}
//+------------------------------------------------------------------+

Ora dobbiamo fare una funzione separata per ottenere dati per RSI dal tempo desiderato e confrontare i prezzi e i valori RSI

E poi così?
if (prevRSIvalue1<70 && (prevRSIvalue0>70) && (prevClose_0>Bid))

    {
    ticket=OrderSend(Symbol(),OP_SELL, 0.1, Ask, Slippage,0, 0, NULL, Magic, 0, Blue);
    return(0);
    }
 
Inserito alla fine del codice da controllare:
int start()
{
int ticket;

  if (OrdersTotal() == 0)
         {
         ticket=OrderSend(Symbol(),OP_SELL, 1, Bid, 0, 0, 0, NULL, 1234, 0, Red);
      
        
         }
         return(0);

}
nel tester non apre un trade. Quale potrebbe essere il problema qui?)
 
strongflex:
L'ho messo alla fine del codice per controllare:
int start()
{
int ticket;

  if (OrdersTotal() == 0)
         {
         ticket=OrderSend(Symbol(),OP_SELL, 1, Bid, 0, 0, 0, NULL, 1234, 0, Red);
      
        
         }
         return(0);

}
nel tester non apre un trade. Quale potrebbe essere il problema qui?)

Chi vi impedisce di visualizzare il codice di errore?

 
Vitalie Postolache:

Chi ti impedisce di visualizzare il codice di errore?

Nessun errore nel tester
 

Cari utenti del forum, ecco la domanda:

È possibile in un blocco di spunta

int start() {}

Creare un evento che, quando viene eseguito, mostrerà una finestra pop-up in cui è possibile impostare manualmente il valore di una variabile.

Questo è simile a ciò che accade quando si imposta una variabile tramite Extern, ma automaticamente durante l'esecuzione del programma, piuttosto che una volta all'avvio.

Vi sarei grato se poteste almeno dirmi da che parte scavare.

Grazie!

 
pro100lexx:

Cari utenti del forum, ecco la domanda:

È possibile in un blocco di spunta

int start() {}

Creare un evento che, quando viene eseguito, mostrerà una finestra pop-up in cui è possibile impostare manualmente il valore di una variabile.

Questo è simile a ciò che accade quando si imposta una variabile tramite Extern, ma automaticamente durante l'esecuzione del programma, piuttosto che una volta all'avvio.

Vi sarei grato se poteste almeno dirmi da che parte scavare.

Grazie!

Scava in kodobase, c'è già una cosa del genere, con un pannello sul grafico. Ecco com'è, per esempio.
 
pro100lexx:

Cari utenti del forum, ecco la domanda:

È possibile in un blocco di spunta

int start() {}

Creare un evento che, quando viene eseguito, mostrerà una finestra pop-up in cui è possibile impostare manualmente il valore di una variabile.

Questo è simile a ciò che accade quando si imposta una variabile con Extern, ma automaticamente durante l'esecuzione del programma piuttosto che una volta all'avvio.

Vi sarò grato se mi direte almeno in che direzione scavare.

Grazie!

Scava verso gli oggetti grafici. Il campo di input in particolare è OBJ_EDIT.

Ecco una funzione per crearla su un grafico:

//+------------------------------------------------------------------+
void SetEditField(const long             chart_id=0,               // ID графика
                  const string           name="Edit",              // имя объекта
                  const int              sub_window=0,             // номер подокна
                  const int              x=0,                      // координата по оси X
                  const int              y=0,                      // координата по оси Y
                  const int              width=50,                 // ширина поля ввода
                  const int              height=18,                // высота поля ввода
                  const string           text="Text",              // текст
                  const string           font="Calibri",           // шрифт
                  const int              font_size=8,              // размер шрифта
                  const ENUM_ALIGN_MODE  align=ALIGN_CENTER,       // способ выравнивания
                  const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // угол графика для привязки
                  const long             z_order=0,                // приоритет на нажатие мышью
                  const color            clr=clrBlack,             // цвет текста
                  const color            back_clr=clrWhite,        // цвет фона
                  const color            border_clr=clrNONE,       // цвет границы
                  const bool             back=false,               // на заднем плане
                  const bool             read_only=false,          // возможность редактировать
                  const bool             selection=false,          // выделить для перемещений
                  const bool             hidden=true)              // скрыт в списке объектов
  {
   if(ObjectFind(chart_id,name)<0) ObjectCreate(chart_id,name,OBJ_EDIT,sub_window,0,0);
   ObjectSetInteger(chart_id,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(chart_id,name,OBJPROP_YDISTANCE,y);
   ObjectSetInteger(chart_id,name,OBJPROP_XSIZE,width);
   ObjectSetInteger(chart_id,name,OBJPROP_YSIZE,height);
   ObjectSetString(chart_id,name,OBJPROP_TEXT,text);
   ObjectSetString(chart_id,name,OBJPROP_FONT,font);
   ObjectSetInteger(chart_id,name,OBJPROP_FONTSIZE,font_size);
   ObjectSetInteger(chart_id,name,OBJPROP_ALIGN,align);
   ObjectSetInteger(chart_id,name,OBJPROP_READONLY,read_only);
   ObjectSetInteger(chart_id,name,OBJPROP_CORNER,corner);
   ObjectSetInteger(chart_id,name,OBJPROP_COLOR,clr);
   ObjectSetInteger(chart_id,name,OBJPROP_BGCOLOR,back_clr);
   ObjectSetInteger(chart_id,name,OBJPROP_BORDER_COLOR,border_clr);
   ObjectSetInteger(chart_id,name,OBJPROP_BACK,back);
   ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_id,name,OBJPROP_SELECTED,selection);
   ObjectSetInteger(chart_id,name,OBJPROP_HIDDEN,hidden);
   ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,z_order);
  }
//+------------------------------------------------------------------+
 
Grazie! Ci darò un'occhiata.
Motivazione: