Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 90

 
toni_starkel Asesor Experto funcionaba hace 1,5 años, ahora no aparece en el gráfico.

la tesis: movimiento=vida, descanso=muerte. ¿Qué dice en el registro? Está en la parte inferior derecha dos pestañas

si yo tuviera uno - lo revisaría y lo arreglaría ...

 

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategia

Preguntas de los principiantes MQL4 MT4 MetaTrader 4

Ilya Prozumentov, 2017.06.11 13:53

Existe un modelo de clase para trabajar con un array.
#property strict
#include <ObjectVariables.mqh>
#include <Arrays\varQSort.mqh>
#include <Arrays\objQSort.mqh>

template<typename T1>
class ArrayList
{
   private:
      T1 array[];
      QuickSorts<T1> *qs;
      int size;
      int index;

   public:
      //прочие функции
      void QuickSort();//отсортировать массив
      //прочие функции
};
//+------------------------------------------------------------------+
//| Сортировка массива
template<typename T1>
void ArrayList::QuickSort()
{
   int idx = index;//сохранение положения индекса
   if(IsPointer(array[0])) // true - массив содержит указатели класса
      qs /*ошибка 2*/ = new ObjQSort<T1>();
   else
      qs /*ошибка 2*/ = new VarQSort<T1>();
   qs.Sort(array, 0, index);
   index = idx;
}

Para esta clase de plantilla, necesitamos implementar la ordenación, dado que el array puede almacenar tipos de datos complejos. Por ejemplo:
ArrayList<PP*> *dde; // PP - класс

Puedo escribir diferentes funciones para tipos simples y complejos, pero el compilador no entiende que las funciones están rígidamente delimitadas por el tipo de datos y sigue maldiciendo:
'<' - operación ilegal usar ArrayList.mqh

Así que decidí incrustar la interfaz:

#property strict
template <typename T1>
interface QuickSorts
{
   void Sort(T1 &array[], int beg, int end);
};
#property strict
#include <Arrays\QuickSorts.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template <typename T1>
class VarQSort : public /*ошибка 1*/ QuickSorts
{
private:

public:
   void Sort(T1 &array[], int beg, int end);
   VarQSort(){}
   ~VarQSort(){}
};
template <typename T1>
void VarQSort::Sort(T1 &array[], int beg,int end)
{
   //алгоритм функции
}
#property strict
#include <Arrays\QuickSorts.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template <typename T1>
class ObjQSort : public /*ошибка 1*/ QuickSorts
{
private:

public:
   void Sort(T1 &array[], int beg, int end){}
   ObjQSort(){}
   ~ObjQSort(){}
};

Todas las partes de la construcción se compilan. Pero si tratas de declararlo:
ArrayList<PP*> *dde; // PP - класс
entonces, al compilar el archivo, estos son los errores:

'QuickSorts' - plantilla incorrecta varQSort.mqh /*error 1*/
'=' - tipo erróneo ArrayList.mqh /*error 2*/


¿Qué debo arreglar en el código para eliminar este desajuste de tipo? No entiendo por qué se produjo en primer lugar.

P.D.
'<' - operación ilegal usar varQSort.mqh
me persigue en esta construcción también. Es este mismo error el que quería eliminar. Pero entiendo este error, y no entiendo esos dos.
template <typename T1>
class VarQSort : public QuickSorts<T1>
//....

template <typename T1>
class ObjQSort : public QuickSorts<T1>
//....
 
fxsaber:
Efectivamente) El error de discrepancia ha desaparecido y el otro con él. Gracias.
 
Saludos compañeros del foro, necesito ayuda para añadir algunos cambios en la función.
enum _EventYesNo{
      YES            = 1,           //ДА
      NO             = 2            //НЕТ
      };
enum howmuch {one = 1,              //Одна
              two = 2,              //Две
              three = 3             //Три
              };

input    _EventYesNo    monday                     = 2;                 //торгуем в ПОНЕДЕЛЬНИК?
input    howmuch        mondayHM                   = 1;                 //Сколько сделок?
input    string         monday_open1               = "00:00";           //
input    string         monday_open2               = "00:00";           //
input    string         monday_open3               = "00:00";           //

input    _EventYesNo    tuesday                    = 2;                 //торгуем во ВТОРНИК?
input    howmuch        tuesdayHM                  = 1;                 //Сколько сделок?
input    string         tuesday_open1              = "00:00";           //
input    string         tuesday_open2              = "00:00";           //
input    string         tuesday_open3              = "00:00";           //

input    _EventYesNo    wednesday                  = 2;                 //торгуем в СРЕДУ?
input    howmuch        wednesdayHM                = 1;                 //Сколько сделок?
input    string         wednesday_open1            = "00:00";           //
input    string         wednesday_open2            = "00:00";           //
input    string         wednesday_open3            = "00:00";           //

input    _EventYesNo    thursday                   = 2;                 //торгуем в ЧЕТВЕРГ?
input    howmuch        thursdayHM                 = 1;                 //Сколько сделок?
input    string         thursday_open1             = "00:00";           //
input    string         thursday_open2             = "00:00";           //
input    string         thursday_open3             = "00:00";           //

input    _EventYesNo    friday                     = 2;                 //торгуем в ПЯТНИЦУ?
input    howmuch        fridayHM                   = 1;                 //Сколько сделок?
input    string         friday_open1               = "00:00";           //
input    string         friday_open2               = "00:00";           //
input    string         friday_open3               = "00:00";           //

extern int         minutes = 5;          // Время торговли(минут) bool    HOUR = true;                     // Часы Вкл (true) / Выкл (folse) //Отправляет true если по времени разрешено торговать bool isTradeTimeString() { datetime servertime = TimeCurrent(); datetime localtime = TimeLocal(); datetime time = 0; datetime hbegin = 0; datetime hend = 0; string TimeBegin = "00:00"; if(DayOfWeek() == 1){if(monday == 1){TimeBegin = monday_open1;}else{return(false);}} if(DayOfWeek() == 2){if(tuesday == 1){TimeBegin = tuesday_open1;}else{return(false);}} if(DayOfWeek() == 3){if(wednesday == 1){TimeBegin = wednesday_open1;}else{return(false);}} if(DayOfWeek() == 4){if(thursday == 1){TimeBegin = thursday_open1;}else{return(false);}} if(DayOfWeek() == 5){if(friday == 1){TimeBegin = friday_open1;}else{return(false);}} string TimeEnd = TimeToString(StrToTime(TimeBegin)+(60*minutes),TIME_MINUTES); if(servertime > localtime) {   time = servertime - localtime;   hbegin = StrToTime(TimeBegin) + time;   hend = StrToTime(TimeEnd) + time; } if(servertime < localtime) {   time = localtime - servertime;   hbegin = StrToTime(TimeBegin) - time;   hend = StrToTime(TimeEnd) - time; } if(localtime == servertime) {   hbegin = StrToTime(TimeBegin);   hend = StrToTime(TimeEnd); } datetime dtBegin, dtEnd;        // Время начала и окончания работы int      hc, he;                // Часы текущего времени и окончания работы dtBegin=StrToTime(TimeToStr(TimeCurrent(),TIME_DATE)+" "+TimeToStr(hbegin,TIME_MINUTES)); dtEnd=StrToTime(TimeToStr(TimeCurrent(),TIME_DATE)+" "+TimeToStr(hend,TIME_MINUTES)); hc = TimeHour(TimeCurrent()); he = TimeHour(dtEnd); if(dtBegin>=dtEnd) {   if(hc>=he)    dtEnd+=24*60*60;   else    dtBegin-=24*60*60; } if(HOUR==true) {   if(TimeCurrent()>=dtBegin && TimeCurrent()<=dtEnd)    return(true);   else   {    if(CountTrades()==0)     return(false);   } } return(true); }

Necesito, por ejemplo el lunes, si tengo que abrir 2 o 3 operaciones, la función compara el tiempo y envía la tubería, pero tengo un tiempo comparado hasta ahora.


	          
 
La exportación de cotizaciones le permitirá elegir a partir de qué fecha quiere descargarlas.

Porque cuando se pulsa el botón "descargar", se descargan 6 000 000 de cotizaciones. No todo el mundo quiere llenar el disco duro con datos de cotizaciones, esperar mucho tiempo hasta que se descarguen y luego eliminar los datos innecesarios de la tabla de cotizaciones.

 

Hola querida... ¿Puede decirme por qué el código de trailing stop especificado para las órdenes de COMPRA funciona correctamente ...

       if (OrderType()==OP_BUY && (Bid-8*D*Point)>OrderStopLoss()&&(Bid-8*D*Point)>OrderOpenPrice()) 
{chk=OrderModify(OrderTicket(),0,NormalizeDouble(Bid-7*Point,Digits),NormalizeDouble(OrderOpenPrice()+25*D*Point,Digits),0,0);}

... ... pero el mismo para las órdenes de VENTA no fija el SL...

       if (OrderType()==OP_SELL &&(Ask+8*D*Point)<OrderStopLoss()&&(Ask+8*D*Point)<OrderOpenPrice()) 
{chk=OrderModify(OrderTicket(),0,NormalizeDouble(Ask+7*Point,Digits),NormalizeDouble(OrderOpenPrice()-25*D*Point,Digits),0,0);}

... La razón es probablemente en la condición(Ask+8*D*Point)<OrderStopLoss(), si la eliminamos, el SL se establecerá, pero el Trailing Stop funciona incorrectamente sin la condición especificada ...

Para las órdenes deCOMPRA ,la condición(Bid-8*D*Point)>OrderStopLoss(), siOrderStopLoss()==0, se aceptacorrectamente (es decir, algún valor > 0) ...

... Perola condición(Ask+8*D*Point)<OrderStopLoss(),OrderStopLoss()==0 no escorrecta ( es decir, algúnvalor es< 0

) ...

Por favor, aconsejen cómo formular correctamente en el código la condición requerida(Ask+8*D*Point)<OrderStopLoss()para que funcione correctamente

el

Trailing Stop con órdenesSELL

.

Agradezco de antemano a todos los que respondan

.
 

Buenas tardes: Hay una función en la que el indicador lee el archivodel historial de ticks. Pero sólo se lee una vez, cuando se carga o actualiza el indicador. ¿Cómo puedo hacer que se lea cada vez que aparece el primer tick de la barra cero?

void ProcessOldCandles(int limit, TickStruct &lastTick)

{

      int hTicksFile = FileOpen(Symbol() + ".tks", FILE_BIN | FILE_READ | FILE_SHARE_READ | FILE_SHARE_WRITE);

   if (hTicksFile < 1)

      return;

      TickStruct tick;

   while (!IsStopped())

   {

      if (!IsReadTimeAndBidAskOfTick(hTicksFile, tick))

         return;

      if (tick.time >= Time[limit])

         break;

   }

   lastTick = tick;

   int barIndex = iBarShift(NULL, 0, tick.time);

      while (barIndex >= 0)

   {

      if (!IsReadTimeAndBidAskOfTick(hTicksFile, tick))

         return;

         if (!IsTickBelongToBar(tick, barIndex))

         barIndex = iBarShift(NULL, 0, tick.time);

         ProcessOneTick(barIndex, tick, lastTick);

   }

      FileClose(hTicksFile);

 
Yaroslav Nykula:

Hola querida... Me pueden decir por qué este código de Trailing Stop para órdenes de COMPRA funciona correctamente ...

... ... pero el mismo para las órdenes de VENTA no fija el SL...

... La razón es probablemente en la condición(Ask+8*D*Point)<OrderStopLoss(), si la eliminamos, el SL se establecerá, pero el Trailing Stop funciona incorrectamente sin la condición especificada ...

Para las órdenes deCOMPRA ,la condición(Bid-8*D*Point)>OrderStopLoss(), cuandoOrderStopLoss()==0 se tomacorrectamente (es decir, algún valor > 0) ...

... Perola condición(Ask+8*D*Point)<OrderStopLoss(), cuandoOrderStopLoss()==0 no se consideracorrecta (es decir, algún valor es< 0

) ...

Por favor, aconsejen cómo formular correctamente en el código la condición requerida(Ask+8*D*Point)<OrderStopLoss()para que funcione correctamente

el

Trailing Stop con órdenesSELL

.

Agradezco de antemano a todos los que respondan

.

Hola a todos ... algo de muy poca actividad en esta rama del foro ... el problema se resuelve así...

 if (OrderSymbol()==Symbol()&&OrderType()==OP_SELL&&OrderLots()<=Lot*3&&(Ask+(Tral+TP)*D*Point)<OrderOpenPrice()&&((OrderStopLoss()!=0&&(Ask+Tral*D*Point)<OrderStopLoss())||OrderStopLoss()==0))
{chk=OrderModify(OrderTicket(),0,NormalizeDouble(Ask+Tral*D*Point,Digits),NormalizeDouble(OrderOpenPrice()-Stepp*D*Point,Digits),0,0);}} 

... Es un poco largo, pero funciona... Quién sabe cómo hacerlo más corto, puede acortarlo, se lo agradecería... el resto de nosotros puede usarlo tal cual.

 

introduzca la función

OrderCloseByTicket (542534564)

Cerrar el pedido por el billete con el lote completo.

para no tener que especificar los lotes, el precio, el deslizamiento.

similar a pulsar una cruz en la orden en el terminal.


introduzca la función

OrderCloseByPos (0)

cerrar la orden por posición.


y entonces no habrá necesidad de prescribir estas engorrosas construcciones.

  for (int i=1; i<=OrdersTotal(); i++)       //Цикл по всем ордерам,..
     {                                        //отражённым в терминале
      if(OrderSelect(i-1,SELECT_BY_POS)==true)//Если есть следующий
        {                                     
         // Здесь должен выполняться ..
         // ..анализ характеристик ордеров 
        }
     }                                        //Конец тела цикла
 

Hola! Los dos números menos q y w se comparan incorrectamente, cuando son iguales, el operador if piensa que uno es mayor que el otro.¿Cuál es el error? Cuando q = -0,0002 y w es también -0,0002, res12=falso, ¿por qué?

double SPREAD=MarketInfo(Symb,MODE_SPREAD);// Спред
static bool res12=true;

start()
{   


   double q=High[0]-3.0*Point-High[1];
   double w=-SPREAD*Point;
      
   if (New_Bar==true&&ticket1<=0)
     {
      if(q>w)
       {
        res12=false; 
        Alert("res12=false");
        Alert (q);
        Alert (w);
       }
     }
      if (New_Bar==true&&ticket1<=0)
     {
        if(q<=w)
        {
         res12=true;
         Alert("res12=true");
         Alert (q);
         Alert (w);
        }
      }





}