C'è un modello di classe per lavorare 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;
}
Per questa classe modello, abbiamo bisogno di implementare l'ordinamento, dato che l'array può memorizzare tipi di dati complessi. Per esempio:
ArrayList<PP*> *dde; // PP - класс
Posso scrivere funzioni diverse per tipi semplici e complessi, ma il compilatore non capisce che le funzioni sono rigidamente delimitate dal tipo di dati e continua a imprecare: '<' - operazione illegale usare ArrayList.mqh
Così ho deciso di incorporare l'interfaccia:
#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(){}
};
Tutte le parti del costrutto compilano. Ma se si cerca di dichiararlo:
ArrayList<PP*> *dde; // PP - класс
poi, quando si compila il file, questi sono gli errori:
'QuickSorts' - template mismatch varQSort.mqh /*errore 1*/ '=' - errore di tipo ArrayList.mqh /*errore 2*/
Cosa dovrei correggere nel codice per eliminare questo type mismatch? Non capisco perché sia successo in primo luogo.
P.S. '<' - operazione illegale usare varQSort.mqh mi perseguita anche in questo costrutto. È proprio di questo errore che volevo sbarazzarmi. Ma capisco questo errore e non capisco questi due.
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);
}
Ho bisogno, per esempio il lunedì, se ho bisogno di aprire 2 o 3 trade, la funzione confronta il tempo e invia il tubo, ma ho un solo tempo confrontato finora.
L'esportazione delle citazioni vi permetterà di scegliere da quale data volete scaricarle.
Perché quando si preme il pulsante "download", 6 000 000 citazioni saranno scaricate. Non tutti vogliono riempire l'hard disk con i dati delle citazioni, aspettare a lungo che siano scaricati, e poi rimuovere i dati inutili dalla tabella delle citazioni.
Ciao caro ... Potete dirmi perché il codice di trailing stop specificato per gli ordini BUY funziona correttamente ...
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);}
... ... ma lo stesso per gli ordini SELL non imposta 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 ragione è molto probabilmente nella condizione(Ask+8*D*Point)<OrderStopLoss(), se la rimuoviamo, SL sarà impostato, ma Trailing Stop funziona in modo errato senza la condizione specificata ...
Per gli ordiniBUY ,la condizione(Bid-8*D*Point)>OrderStopLoss(), seOrderStopLoss()==0, è accettatacorrettamente (cioè qualche valore > 0) ...
... Mala condizione(Ask+8*D*Point)<OrderStopLoss(),OrderStopLoss()==0 non ècorretta ( cioè qualchevalore è< 0
) ...
Vi prego di consigliarmi come formulare correttamente nel codice la condizione richiesta(Ask+8*D*Point)<OrderStopLoss()per il corretto funzionamento delTrailing Stop con ordiniSELL
Buon pomeriggio: c'è una funzione in cui l'indicatore legge il file dellastoria dei tick. Ma viene letto solo una volta, quando l'indicatore viene caricato o aggiornato. Come posso farlo leggere ogni volta quando appare il primo tick della barra zero?
Ciao caro ... Potete dirmi perché il codice di trailing stop specificato per gli ordini BUY funziona correttamente ...
... ... ma lo stesso per gli ordini SELL non imposta SL...
... La ragione è molto probabilmente nella condizione(Ask+8*D*Point)<OrderStopLoss(), se la rimuoviamo, SL sarà impostato, ma Trailing Stop funziona in modo errato senza la condizione specificata ...
Per gli ordiniBUY ,la condizione(Bid-8*D*Point)>OrderStopLoss(), quandoOrderStopLoss()==0 è presacorrettamente (cioè qualche valore > 0) ...
... Mala condizione(Ask+8*D*Point)<OrderStopLoss(), quandoOrderStopLoss()==0 non è consideratacorretta (cioè qualche valore è< 0
) ...
Vi prego di consigliarmi come formulare correttamente nel codice la condizione richiesta(Ask+8*D*Point)<OrderStopLoss()per il corretto funzionamento delTrailing Stop con ordiniSELL
.
Ciao a tutti ... qualcosa di molto bassa attività in questo ramo del forum ... il problema è risolto in questo modo ...
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);}}
... È un po' lungo, ma funziona... Chi sa come accorciarlo, può accorciarlo, lo apprezzerei... il resto di noi può usarlo così com'è.
Chiudere l'ordine per biglietto con lotto completo.
in modo da non dover specificare lotti, prezzo, slippage.
simile a cliccare una croce sull'ordine nel terminale.
inserire la funzione
OrderCloseByPos (0)
chiudere l'ordine per posizione.
e allora non ci sarà bisogno di prescrivere queste costruzioni ingombranti.
for(inti=1; i<=OrdersTotal(); i++)//Цикл по всем ордерам,..{//отражённым в терминалеif(OrderSelect(i-1,SELECT_BY_POS)==true)//Если есть следующий{// Здесь должен выполняться ..// ..анализ характеристик ордеров }}//Конец тела цикла
Ciao, i due numeri meno q e w sono confrontati in modo errato, quando sono uguali, l'operatore if pensa che uno sia maggiore dell'altro, qual è l'errore? Quando q = -0,0002 e w è anche -0,0002, res12=falso, perché?
la tesi: movimento=vita, riposo=morte. Cosa c'è scritto nel registro? è in basso a destra due schede
se ne avessi uno - lo controllerei e lo riparerei ...
Forum sul trading, sistemi di trading automatico e test di strategia
Domande dai principianti MQL4 MT4 MetaTrader 4
Ilya Prozumentov, 2017.06.11 13:53
C'è un modello di classe per lavorare con un array.Per questa classe modello, abbiamo bisogno di implementare l'ordinamento, dato che l'array può memorizzare tipi di dati complessi. Per esempio:
ArrayList<PP*> *dde; // PP - классPosso scrivere funzioni diverse per tipi semplici e complessi, ma il compilatore non capisce che le funzioni sono rigidamente delimitate dal tipo di dati e continua a imprecare:
'<' - operazione illegale usare ArrayList.mqh
Così ho deciso di incorporare l'interfaccia:
Tutte le parti del costrutto compilano. Ma se si cerca di dichiararlo:
ArrayList<PP*> *dde; // PP - классpoi, quando si compila il file, questi sono gli errori:'QuickSorts' - template mismatch varQSort.mqh /*errore 1*/
'=' - errore di tipo ArrayList.mqh /*errore 2*/
P.S.Cosa dovrei correggere nel codice per eliminare questo type mismatch? Non capisco perché sia successo in primo luogo.
'<' - operazione illegale usare varQSort.mqh
mi perseguita anche in questo costrutto. È proprio di questo errore che volevo sbarazzarmi. Ma capisco questo errore e non capisco questi due.
Ho bisogno, per esempio il lunedì, se ho bisogno di aprire 2 o 3 trade, la funzione confronta il tempo e invia il tubo, ma ho un solo tempo confrontato finora.
Perché quando si preme il pulsante "download", 6 000 000 citazioni saranno scaricate. Non tutti vogliono riempire l'hard disk con i dati delle citazioni, aspettare a lungo che siano scaricati, e poi rimuovere i dati inutili dalla tabella delle citazioni.
Ciao caro ... Potete dirmi perché il codice di trailing stop specificato per gli ordini BUY funziona correttamente ...
... ... ma lo stesso per gli ordini SELL non imposta SL...
... La ragione è molto probabilmente nella condizione(Ask+8*D*Point)<OrderStopLoss(), se la rimuoviamo, SL sarà impostato, ma Trailing Stop funziona in modo errato senza la condizione specificata ...
Per gli ordiniBUY ,la condizione(Bid-8*D*Point)>OrderStopLoss(), seOrderStopLoss()==0, è accettatacorrettamente (cioè qualche valore > 0) ...
... Mala condizione(Ask+8*D*Point)<OrderStopLoss(),OrderStopLoss()==0 non ècorretta ( cioè qualchevalore è< 0
) ...Vi prego di consigliarmi come formulare correttamente nel codice la condizione richiesta(Ask+8*D*Point)<OrderStopLoss()per il corretto funzionamento delTrailing Stop con ordiniSELL
.
Buon pomeriggio: c'è una funzione in cui l'indicatore legge il file dellastoria dei tick. Ma viene letto solo una volta, quando l'indicatore viene caricato o aggiornato. Come posso farlo leggere ogni volta quando appare il primo tick della barra zero?
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);
Ciao caro ... Potete dirmi perché il codice di trailing stop specificato per gli ordini BUY funziona correttamente ...
... ... ma lo stesso per gli ordini SELL non imposta SL...
... La ragione è molto probabilmente nella condizione(Ask+8*D*Point)<OrderStopLoss(), se la rimuoviamo, SL sarà impostato, ma Trailing Stop funziona in modo errato senza la condizione specificata ...
Per gli ordiniBUY ,la condizione(Bid-8*D*Point)>OrderStopLoss(), quandoOrderStopLoss()==0 è presacorrettamente (cioè qualche valore > 0) ...
... Mala condizione(Ask+8*D*Point)<OrderStopLoss(), quandoOrderStopLoss()==0 non è consideratacorretta (cioè qualche valore è< 0
) ...Vi prego di consigliarmi come formulare correttamente nel codice la condizione richiesta(Ask+8*D*Point)<OrderStopLoss()per il corretto funzionamento delTrailing Stop con ordiniSELL
.
Ciao a tutti ... qualcosa di molto bassa attività in questo ramo del forum ... il problema è risolto in questo modo ...
... È un po' lungo, ma funziona... Chi sa come accorciarlo, può accorciarlo, lo apprezzerei... il resto di noi può usarlo così com'è.
inserire la funzione
OrderCloseByTicket (542534564)
Chiudere l'ordine per biglietto con lotto completo.
in modo da non dover specificare lotti, prezzo, slippage.
simile a cliccare una croce sull'ordine nel terminale.
inserire la funzione
OrderCloseByPos (0)
chiudere l'ordine per posizione.
e allora non ci sarà bisogno di prescrivere queste costruzioni ingombranti.
Ciao, i due numeri meno q e w sono confrontati in modo errato, quando sono uguali, l'operatore if pensa che uno sia maggiore dell'altro, qual è l'errore? Quando q = -0,0002 e w è anche -0,0002, res12=falso, perché?