Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 5

 
Vladymyr Glushko:
Pero, ¿cómo hacerlo paso a paso? ..... objetos gráficos (qué son y cómo ponerlos), poner etiquetas de datos en el gráfico (dónde introducir y con qué datos)....... perdón por las preguntas estúpidas.

Software.

Es necesario escribir un indicador de información con los datos que desea.

 
strongflex:
A continuación, si el RSI cruzó el nivel de hace 20 minutos, comprobamos el precio, es decir, para ir en corto el precio debe ser más bajo que hace 20 minutos. Muchas gracias. Si funciona, te debo una promesa))

Como lo creamos lo más cerca posible de MQL5, no utilizaremos las funciones MQL4 para obtener el desplazamiento de la barra por tiempo y el precio de cierre (iBarShift() e iClose() respectivamente).

Para ello contamos con nuestras propias funciones: GetBarShift() y GetPriceClose(). Además, tendremos que obtener la hora de la barra utilizando la función GetTime() en lugar de iTime(), ya que rechazamos las funciones estándar de MQL4.

Aquí hay un Asesor Experto de prueba:

//+------------------------------------------------------------------+
//|                                               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);
}
//+------------------------------------------------------------------+

Ahora tenemos que hacer una función separada para recibir los datos del RSI para el tiempo requerido y comparar los precios y los valores del RSI

 
Artyom Trishkin:

Dado que lo creamos lo más cercano a MQL5, no utilizaremos las funciones de MQL4 para obtener el desplazamiento de la barra por tiempo y el precio de cierre (iBarShift() e iClose() respectivamente).

Para ello contamos con nuestras propias funciones: GetBarShift() y GetPriceClose(). Además, tendremos que obtener la hora de la barra utilizando la función GetTime() en lugar de iTime(), ya que rechazamos las funciones estándar de MQL4.

Aquí hay un Asesor Experto de prueba:

//+------------------------------------------------------------------+
//|                                               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);
}
//+------------------------------------------------------------------+

Ahora tenemos que hacer una función separada para obtener los datos del RSI del tiempo deseado y comparar los precios y los valores del RSI

¿Y luego así?
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);
    }
 
Se inserta al final del código para comprobarlo:
int start()
{
int ticket;

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

}
en el probador no abre una operación. ¿Cuál podría ser el problema aquí?)
 
strongflex:
Lo pongo al final del código para comprobarlo:
int start()
{
int ticket;

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

}
en el probador no abre una operación. ¿Cuál podría ser el problema aquí?)

¿Quién le impide mostrar el código de error?

 
Vitalie Postolache:

¿Quién le impide mostrar el código de error?

No hay errores en el probador
 

Estimados usuarios del foro, esta es la pregunta:

¿Es posible en un bloque de garrapatas

int inicio() {}

Crear un evento que, al ejecutarse, muestre una ventana emergente en la que se pueda establecer manualmente el valor de una variable.

Esto es similar a lo que sucede cuando se establece una variable a través de Extern, pero automáticamente durante la ejecución del programa, en lugar de una vez en el inicio.

Les agradecería que al menos me dijeran por dónde hay que cavar.

Gracias.

 
pro100lexx:

Estimados usuarios del foro, esta es la pregunta:

¿Es posible en un bloque de garrapatas

int inicio() {}

Crear un evento que, al ejecutarse, muestre una ventana emergente en la que se pueda establecer manualmente el valor de una variable.

Esto es similar a lo que sucede cuando se establece una variable a través de Extern, pero automáticamente durante la ejecución del programa, en lugar de una vez en el inicio.

Les agradecería que al menos me dijeran por dónde hay que cavar.

Gracias.

Busca en kodobase, ya existe algo así, con un panel en el gráfico. Así es, por ejemplo.
 
pro100lexx:

Estimados usuarios del foro, esta es la pregunta:

¿Es posible en un bloque de garrapatas

int inicio() {}

Crear un evento que, al ejecutarse, muestre una ventana emergente en la que se pueda establecer manualmente el valor de una variable.

Esto es similar a lo que ocurre cuando se establece una variable con Extern, pero automáticamente durante la ejecución del programa en lugar de una vez al inicio.

Les agradeceré que me digan al menos en qué dirección cavar.

Gracias.

Excavar en la dirección de los objetos gráficos. El campo de entrada en particular es OBJ_EDIT.

Aquí hay una función para crearla en un gráfico:

//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
 
Gracias. Lo investigaré.
Razón de la queja: