Il existe un modèle de classe pour travailler avec un tableau.
#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;
}
Pour cette classe modèle, nous devons implémenter le tri, étant donné que le tableau peut stocker des types de données complexes. Par exemple :
ArrayList<PP*> *dde; // PP - класс
Je peux écrire des fonctions différentes pour les types simples et complexes, mais le compilateur ne comprend pas que les fonctions sont rigidement délimitées par le type de données et continue à jurer : '<' - opération illégale utiliser ArrayList.mqh
J'ai donc décidé d'intégrer l'interface :
#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(){}
};
Toutes les parties de la construction se compilent. Mais si vous essayez de le déclarer :
ArrayList<PP*> *dde; // PP - класс
puis, lors de la compilation du fichier, voici les erreurs :
QuickSorts' - incompatibilité de modèle varQSort.mqh /*erreur 1*/ '=' - incompatibilité de type ArrayList.mqh /*erreur 2*/
Que dois-je corriger dans le code pour éliminer cette incompatibilité de type ? Je ne comprends pas pourquoi cela s'est produit en premier lieu.
P.S. '<' - opération illégale utiliser varQSort.mqh me hante aussi dans cette construction. C'est justement cette erreur dont je voulais me débarrasser. Mais je comprends cette erreur, et je ne comprends pas ces deux-là.
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);
}
J'ai besoin, par exemple le lundi, si je dois ouvrir 2 ou 3 transactions, la fonction compare le temps et envoie le tuyau, mais j'ai un temps comparé jusqu'à présent.
L'exportation des devis vous permettra de choisir la date à laquelle vous souhaitez les télécharger.
En effet, lorsque vous appuyez sur le bouton "Télécharger", 6 000 000 de citations seront téléchargées. Tout le monde n'a pas envie de remplir le disque dur de données de citations, d'attendre longtemps qu'elles soient téléchargées, puis de supprimer les données inutiles de la table des citations.
Bonjour, ma chère... Pouvez-vous me dire pourquoi le code de trailing stop spécifié pour les ordres BUY fonctionne correctement ...
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);}
... ... mais le même pour les ordres de VENTE ne fixe pas de 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 raison est probablement dans la condition(Ask+8*D*Point)<OrderStopLoss(), si nous la supprimons, SL sera mis, mais Trailing Stop fonctionne incorrectement sans la condition spécifiée ...
Pour les ordres d'achat , lacondition(Bid-8*D*Point)>OrderStopLoss(), siOrderStopLoss()==0, est acceptéecorrectement (i.e. une certaine valeur > 0) ...
... Maisla condition(Ask+8*D*Point)<OrderStopLoss(),OrderStopLoss()==0 n'est pascorrecte (i.e. une certainevaleur est< 0
) ...
Veuillez m'indiquer comment formuler correctement dans le code la condition requise(Ask+8*D*Point)<OrderStopLoss()pour un fonctionnement correct duTrailing Stop avec les ordresSELL.
Bonjour : Il existe une fonction où l'indicateur lit le fichier d'historique des tics. Mais il n'est lu qu'une seule fois, lorsque l'indicateur est chargé ou mis à jour. Comment puis-je faire en sorte qu'il soit lu à chaque fois que le premier tick de la barre zéro apparaît ?
Bonjour, ma chère... Pouvez-vous me dire pourquoi le code de trailing stop spécifié pour les ordres BUY fonctionne correctement ...
... ... mais le même pour les ordres de VENTE ne fixe pas de SL...
... La raison est probablement dans la condition(Ask+8*D*Point)<OrderStopLoss(), si nous la supprimons, SL sera mis, mais Trailing Stop fonctionne incorrectement sans la condition spécifiée ...
Pour les ordresBUY , lacondition(Bid-8*D*Point)>OrderStopLoss(), lorsqueOrderStopLoss()==0 est prisecorrectement (c'est-à-dire une valeur > 0) ...
... Maisla condition(Ask+8*D*Point)<OrderStopLoss(), lorsqueOrderStopLoss()==0 n' est pas considérée commecorrecte (c'est-à-dire qu'une certaine valeur est< 0
) ...
Veuillez m'indiquer comment formuler correctement dans le code la condition requise(Ask+8*D*Point)<OrderStopLoss()pour un fonctionnement correct duTrailing Stop avec les ordresSELL.
Je remercie d'avance tous ceux qui ont répondu
.
Bonjour à tous ... quelque chose de très faible activité dans cette branche du forum ... le problème est résolu de cette façon ...
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);}}
... C'est un peu long, mais ça marche... Qui sait comment l'écrire plus court, pouvez-vous le raccourcir, je vous en serais reconnaissant... le reste d'entre nous peut l'utiliser tel quel.
afin que vous n'ayez pas à spécifier les lots, le prix, le slippage.
similaire à cliquer une croix sur l'ordre dans le terminal.
entrer la fonction
OrderCloseByPos (0)
fermer la commande par position.
et alors il n'y aura plus besoin de prescrire ces constructions encombrantes.
for(inti=1; i<=OrdersTotal(); i++)//Цикл по всем ордерам,..{//отражённым в терминалеif(OrderSelect(i-1,SELECT_BY_POS)==true)//Если есть следующий{// Здесь должен выполняться ..// ..анализ характеристик ордеров }}//Конец тела цикла
Bonjour ! Les deux nombres moins q et w sont comparés de manière incorrecte, alors qu'ils sont égaux, l'opérateur if pense que l'un est plus grand que l'autre.Quelle est l'erreur ? Lorsque q = -0.0002 et que w est également -0.0002, res12=faux, pourquoi ?
la thèse : mouvement=vie, repos=mort. Qu'est-ce que ça dit dans le journal ? C'est en bas à droite, deux onglets.
si j'en avais un - je le vérifierais et le réparerais ...
Forum sur le trading, les systèmes de trading automatisé et les tests de stratégie
Questions des débutants MQL4 MT4 MetaTrader 4
Ilya Prozumentov, 2017.06.11 13:53
Il existe un modèle de classe pour travailler avec un tableau.Pour cette classe modèle, nous devons implémenter le tri, étant donné que le tableau peut stocker des types de données complexes. Par exemple :
ArrayList<PP*> *dde; // PP - классJe peux écrire des fonctions différentes pour les types simples et complexes, mais le compilateur ne comprend pas que les fonctions sont rigidement délimitées par le type de données et continue à jurer :
'<' - opération illégale utiliser ArrayList.mqh
J'ai donc décidé d'intégrer l'interface :
Toutes les parties de la construction se compilent. Mais si vous essayez de le déclarer :
ArrayList<PP*> *dde; // PP - классpuis, lors de la compilation du fichier, voici les erreurs :QuickSorts' - incompatibilité de modèle varQSort.mqh /*erreur 1*/
'=' - incompatibilité de type ArrayList.mqh /*erreur 2*/
P.S.Que dois-je corriger dans le code pour éliminer cette incompatibilité de type ? Je ne comprends pas pourquoi cela s'est produit en premier lieu.
'<' - opération illégale utiliser varQSort.mqh
me hante aussi dans cette construction. C'est justement cette erreur dont je voulais me débarrasser. Mais je comprends cette erreur, et je ne comprends pas ces deux-là.
J'ai besoin, par exemple le lundi, si je dois ouvrir 2 ou 3 transactions, la fonction compare le temps et envoie le tuyau, mais j'ai un temps comparé jusqu'à présent.
En effet, lorsque vous appuyez sur le bouton "Télécharger", 6 000 000 de citations seront téléchargées. Tout le monde n'a pas envie de remplir le disque dur de données de citations, d'attendre longtemps qu'elles soient téléchargées, puis de supprimer les données inutiles de la table des citations.
Bonjour, ma chère... Pouvez-vous me dire pourquoi le code de trailing stop spécifié pour les ordres BUY fonctionne correctement ...
... ... mais le même pour les ordres de VENTE ne fixe pas de SL...
... La raison est probablement dans la condition(Ask+8*D*Point)<OrderStopLoss(), si nous la supprimons, SL sera mis, mais Trailing Stop fonctionne incorrectement sans la condition spécifiée ...
Pour les ordres d'achat , lacondition(Bid-8*D*Point)>OrderStopLoss(), siOrderStopLoss()==0, est acceptéecorrectement (i.e. une certaine valeur > 0) ...
... Maisla condition(Ask+8*D*Point)<OrderStopLoss(),OrderStopLoss()==0 n'est pascorrecte (i.e. une certainevaleur est< 0
) ...Veuillez m'indiquer comment formuler correctement dans le code la condition requise(Ask+8*D*Point)<OrderStopLoss()pour un fonctionnement correct duTrailing Stop avec les ordresSELL.
Je remercie d'avance tous ceux qui ont répondu
.Bonjour : Il existe une fonction où l'indicateur lit le fichier d'historique des tics. Mais il n'est lu qu'une seule fois, lorsque l'indicateur est chargé ou mis à jour. Comment puis-je faire en sorte qu'il soit lu à chaque fois que le premier tick de la barre zéro apparaît ?
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);
Bonjour, ma chère... Pouvez-vous me dire pourquoi le code de trailing stop spécifié pour les ordres BUY fonctionne correctement ...
... ... mais le même pour les ordres de VENTE ne fixe pas de SL...
... La raison est probablement dans la condition(Ask+8*D*Point)<OrderStopLoss(), si nous la supprimons, SL sera mis, mais Trailing Stop fonctionne incorrectement sans la condition spécifiée ...
Pour les ordresBUY , lacondition(Bid-8*D*Point)>OrderStopLoss(), lorsqueOrderStopLoss()==0 est prisecorrectement (c'est-à-dire une valeur > 0) ...
... Maisla condition(Ask+8*D*Point)<OrderStopLoss(), lorsqueOrderStopLoss()==0 n' est pas considérée commecorrecte (c'est-à-dire qu'une certaine valeur est< 0
) ...Veuillez m'indiquer comment formuler correctement dans le code la condition requise(Ask+8*D*Point)<OrderStopLoss()pour un fonctionnement correct duTrailing Stop avec les ordresSELL.
Je remercie d'avance tous ceux qui ont répondu
.Bonjour à tous ... quelque chose de très faible activité dans cette branche du forum ... le problème est résolu de cette façon ...
... C'est un peu long, mais ça marche... Qui sait comment l'écrire plus court, pouvez-vous le raccourcir, je vous en serais reconnaissant... le reste d'entre nous peut l'utiliser tel quel.
entrer la fonction
OrderCloseByTicket (542534564)
Fermer l'ordre par ticket avec le lot complet.
afin que vous n'ayez pas à spécifier les lots, le prix, le slippage.
similaire à cliquer une croix sur l'ordre dans le terminal.
entrer la fonction
OrderCloseByPos (0)
fermer la commande par position.
et alors il n'y aura plus besoin de prescrire ces constructions encombrantes.
Bonjour ! Les deux nombres moins q et w sont comparés de manière incorrecte, alors qu'ils sont égaux, l'opérateur if pense que l'un est plus grand que l'autre.Quelle est l'erreur ? Lorsque q = -0.0002 et que w est également -0.0002, res12=faux, pourquoi ?