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 stricttemplate <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:
¿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>//....
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
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?
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.
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(inti=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é?
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.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:
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*/
P.D.¿Qué debo arreglar en el código para eliminar este desajuste de tipo? No entiendo por qué se produjo en primer lugar.
'<' - 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.
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.
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 ...
... ... 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(), 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
elTrailing 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);
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
elTrailing 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í...
... 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.
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é?