//+------------------------------------------------------------------+//| Ozero.mq4 |//| Copyright 2014, Vinin |//| http://vinin.ucoz.ru |//+------------------------------------------------------------------+#property copyright"Copyright 2014, Vinin"#property link"http://vinin.ucoz.ru"#property version"1.00"#property strict// -------- переменные --- Н -----externdouble gLot=0.1; // размер лота для покупки externdouble gPoint=0.001;
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+// -------- переменные --- К ----- int init()
{
return(0);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int start()
{
// Открытие позицииif(OrdersTotal()==0)
{
Print(" Открытие первой позиции ");
double _Ask=MarketInfo("GBPUSD",MODE_ASK);
int ticket=OrderSend("GBPUSD",OP_BUY,gLot,_Ask,15,0,0);
if(ticket>0)
{
Print(" ОРДЕР ОТКРЫТ ",ticket);
}
}
double _Bid=MarketInfo("GBPUSD",MODE_BID); //для ценыfor(int pos=OrdersTotal()-1;pos>=0;pos--)
{
if(OrderSelect(pos,SELECT_BY_POS))
{
if(OrderOpenPrice()+gPoint<_Bid)
{
OrderClose(OrderTicket(),OrderLots(),_Bid,15);
ResetLastError();
if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+GetLastError());
}
}
}
return(0);
}
Bonjour.
Le programme se présente comme suit.
Lors de la compilation, il donne :
Ozero.mq4'Ozero.mq4 1 1 la valeur de retour de 'OrderClose' doit être vérifiée Ozero.mq4 46 13 conversion implicite de 'nombre' en 'chaîne' Ozero.mq4 49 117 0 erreur(s), 2 avertissement(s) 1 3
L'onglet "résultats" montre que des ordres sont ouverts et fermés.
8 - J'ai interrompu le travail en fermant le testeur.
Ensuite, nous examinons le "Journal" :
2014.10.31 07:46:44.837 GBPUSD,M15 : 4453 tick events (5608 bars, 340128 bar states) traités en 312876 ms (temps total 324436 ms) 2014.10.31 07:46:44.837 2014.08.26 13:13 Testeur : l'ordre n°4 est clos 2014.10.31 07:46:44.798 2014.08.26 13:13 Visual tester arrêté 2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15 : ORDER OPEN 4 2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15 : ouvert #4 acheter 0.10 GBPUSD à 1.6590 ok 2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15 : Open #4 acheter 0.10 GBPUSD à 1.6590 ok 2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15 : Je ne pense pas qu'il ait fermé. Nous y voilà : 4108 2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15 : Erreur OrderClose 4108 2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15 : ticket 3 inconnu pour la fonction OrderClose 2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15 : clôture #3 achat 0.10 GBPUSD à 1.6576 au prix 1.6586 2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15 : HOLD OPEN #3 2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15 : ouvert #3 acheter 0.10 GBPUSD à 1.6576 ok 2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15 : Ouvrir la position #1 2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15 : Quoi de neuf ? Nous y voilà : 4108 2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15 : Erreur OrderClose 4108 2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15 : ticket 2 inconnu pour la fonction OrderClose 2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15 : close #2 acheter 0.10 GBPUSD à 1.6564 au prix 1.6574 2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15 : HOLD OPEN 2 2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15 : open #2 buy 0.10 GBPUSD at 1.6564 ok 2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15 : Ouverture de la première position 2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15 : Quoi de neuf ? Nous y voilà : 4108 2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15 : Erreur OrderClose 4108 2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15 : ticket 1 inconnu pour la fonction OrderClose 2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15 : clôture #1 achat 0.10 GBPUSD à 1.6550 au prix 1.6562 2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15 : ORDER OPEN 1 2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15 : ouvert #1 acheter 0.10 GBPUSD à 1.6550 ok 2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15 : ouvert #1 acheter 0.10 GBPUSD à 1.6550 ok 2014.10.31 07:41:31.958 Entrées Ozero : gLot=0.1 ; gPoint=0.001 ;
Maintenant, je suis complètement perdu. D'une part, les ordres sont fermés comme vous pouvez le voir sur le graphique et dans les résultats, d'autre part, le code est exécuté avec des erreurs comme vous pouvez le voir dans le journal : (((((((((((.
//ResetLastError();//if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+GetLastError());
Bonjour.
Suppression de deux lignes. Tout fonctionne. Et tout s'affiche correctement sur le graphique, dans les résultats et dans les journaux.
Question : lors de la compilation, il donne
"Ozero".mq4'Ozero.mq4 1 1 La valeur de retour de 'OrderClose' doit être vérifiée Ozero.mq4 46 13 0 erreur(s), 1 avertissement(s) 1 2
De quoi le compilateur me met-il en garde ? La 46ème ligne est OrderClose(OrderTicket(),OrderLots(),_Bid,15) ;
Pouvez-vous me dire ce qui pourrait causer le problème qui s'est produit aujourd'hui ?
L'EA a une option pour arrêter les transactions 15 minutes avant la fermeture du marché le vendredi.
Quand un nouveau jour apparaît, l'EA vérifie si c'est vendredi, alors aujourd'hui nous arrêtons le trading dans StringToTime("23:59")-15*60
Dans le testeur de stratégie, cette fonction fonctionne correctement. Cependant, dans le trading réel, je vois une situation totalement différente - le conseiller expert arrête le trading au premier tick lorsque le vendredi arrive.
Voici les impressions du journal d'Expert Advisor :
Courtier n°1, démo :
0 05:59:47.731 Scalper GBPAUDpt,M1 : Fin dans le vendredi = 2014.10.23 23:44:00
Courtier 2, réel :
0 03:00:11.999 Scalper EURUSD,M1 : Fin dans le vendredi = 2014.10.23 23:44:00
C'est-à-dire que lorsque la barre quotidienne d'aujourd'hui apparaît (vendredi 24 octobre) sur le premier tick, l'EA
convertira la ligne "23:59" en heure d'hier, au lieu de lui attribuer le jour d'aujourd'hui.
Toutefois, si le conseiller expert est redémarré le vendredi en milieu de journée, il déterminera correctement l'heure d'achèvement.
J'ai trouvé la raison de ce problème : https://forum.mql4.com/33023.
Comme prévu, il s'agit pratiquement d'un bug dans la fonction StringToTime. Tous les symptômes sont similaires. Cette fonction convertit la chaîne "23:59" en date avec la date du PC local mais pas avec la date de MT4. Et dans le testeur, comme nous le savons, la date du PC local est émulée et assimilée à l'heure du terminal. C'est pourquoi tout fonctionne correctement dans le testeur, mais la démo/le temps réel entraîne des problèmes et des pertes. Bien sûr, la documentation ne dit pas d'où vient la date et le lien ci-dessus montre que ce problème a été signalé il y a 4 ans, mais apparemment les methaquotes s'en moquent.
2. ce code fermera absolument tous les ordres, que je les ouvre manuellement ou par programme ? C'est-à-dire que nous ne trouverons jamais un ordre que cette partie du programme ne peut pas fermer ?
Quelqu'un a-t-il fait défiler du texte à l'écran ? Par exemple - la commande d'untel ouverte/fermée/modifiée, etc... Des nouvelles d'untel ou d'untel... ?
Si vous le voulez bien, montrez-moi un bout de code.
Quelqu'un a-t-il fait défiler du texte à l'écran ? Par exemple - la commande d'untel ouverte/fermée/modifiée, etc... Des nouvelles d'untel ou d'untel... ?
Si vous le voulez bien, montrez-moi un bout de code.
//+------------------------------------------------------------------+// Если bool print = true или нет окна индикатора, то функция будет выводить сообщения в журналvoid iPrint(string mess1, int sz=9, color color1=clrDarkGray,
string mess2="", color color2=clrDarkGray,
string mess3="", color color3=clrDarkGray,
string mess4="", color color4=clrDarkGray,
bool draws=true) {
string NameGrafText, message, nm;
int i, y, k, shift, Win_Num=-1, num=0;
color cl;
Win_Num=WindowFind("Win_Inform");
if (mess1=="") {
//Print("Func iPrint: Передана пустая строка, выходим");return;
}
if (!draws || Win_Num<0) {
message=mess1+mess2+mess3+mess4;
Print(message);
return;
}
k=ArraySize(Mass_Name_Message)-1;
if (StringLen(mess1)>0) num++;
if (StringLen(mess2)>0) num++;
if (StringLen(mess3)>0) num++;
if (StringLen(mess4)>0) num++;
// Смещение и перекрашивание старых сообщений for (i=k; i>=0; i--) {
NameGrafText=Mass_Name_Message[i];
if (StringLen(NameGrafText)>0) {
if (ObjectFind(NameGrafText)==Win_Num) {
if (i+num>k) { // Удаляем самую верхнюю строчкуObjectDelete(NameGrafText);
Mass_Name_Message[i]="";
}
elseif (i+num<=k) { // Сдвигаем и перекрашиваем старые сообщения
Mass_Name_Message[i+num]=Mass_Name_Message[i];
y=(int)ObjectGet(NameGrafText, OBJPROP_YDISTANCE); // старая координата Y
ObjectSet (NameGrafText, OBJPROP_YDISTANCE, y+(sz+1)*num); // новая координата Y
ObjectSet (NameGrafText, OBJPROP_COLOR, clrDimGray); // новый цвет
}
}
}
}
// Вывод новых сообщений
shift=num;
uint v=GetTickCount();
for (i=0; i<num; i++) {
shift--;
NameGrafText=Prefix+"_GT_"+IntegerToString(i)+"_"+IntegerToString(v); // Уникальное имя объектаint app=0;
while (ObjectFind(NameGrafText)==Win_Num) { // Если всё-таки такой объект есть
app++;
NameGrafText=Prefix+"_GT_"+IntegerToString(i)+"_"+IntegerToString(v)+"_"+IntegerToString(app); // добавим к его имени "хвостик"
}
Mass_Name_Message[num-1-i]=NameGrafText;
switch (i) {
case0: message=mess1; cl=color1; break;
case1: message=mess2; cl=color2; break;
case2: message=mess3; cl=color3; break;
case3: message=mess4; cl=color4; break;
default:message=mess1; cl=color1; break;
}
ObjectCreate (NameGrafText, OBJ_LABEL, Win_Num, 0, 0);
ObjectSetText(NameGrafText, message, sz, "Courier New", cl);
ObjectSet (NameGrafText, OBJPROP_COLOR, cl); // цвет
ObjectSet (NameGrafText, OBJPROP_CORNER, 2); // угол
ObjectSet (NameGrafText, OBJPROP_XDISTANCE, 150); // координата Х
ObjectSet (NameGrafText, OBJPROP_YDISTANCE, 2+(sz+1)*shift); // координата Y
WindowRedraw();
}
}
//+------------------------------------------------------------------+
Exemple d'utilisation d'un message en une seule couleur (vous pouvez avoir 4 couleurs sur une ligne pour différents mots) :
if(get.BarOpenLastPos(sy,PERIOD_H4,OP_SELL,mn)!=0) {
string mess1="На D1 вниз, на H4 ниже SAR, M15 сигнал. Продаём";
iPrint(mess1,9,clrBlue);
trade.OpenS(sy,lots,mn,0.0,0.0,co);
}
Il doit y avoir un indicateur vide nommé Win_Inform sur le graphique.
Bonjour ! Pourriez-vous me dire pourquoi j'ai parfois un opérateur ifle qui ne fonctionne pas.
Voici un exemple :
Où :
H3 est la valeur du prix du niveau
price est le prix actuel
Le résultat est que le prix atteint ce niveau (parfois même s'y arrête), mais l'alerte ne se déclenche pas.
Pouvez-vous me dire quelle est l'erreur ?
Bonjour.
Le programme se présente comme suit.
Lors de la compilation, il donne :
Ozero.mq4'Ozero.mq4 1 1
la valeur de retour de 'OrderClose' doit être vérifiée Ozero.mq4 46 13
conversion implicite de 'nombre' en 'chaîne' Ozero.mq4 49 117
0 erreur(s), 2 avertissement(s) 1 3
L'onglet "résultats" montre que des ordres sont ouverts et fermés.
1 2014.08.25 00:00 acheter 1 0.10 1.6550 0.0000 0.0000 0.00 10000.00
2 2014.08.25 06:30 fermer 1 0.10 1.6562 0.0000 0.0000 0.12 10000.12
3 2014.08.25 06:31 acheter 2 0.10 1.6564 0.0000 0.0000 0.00 10000.12
4 2014.08.25 10:00 fermer 2 0.10 1.6574 0.0000 0.0000 0.10 10000.22
5 2014.08.25 10:00 acheter 3 0.10 1.6576 0.0000 0.0000 0.00 10000.22
6 2014.08.25 12:58 fermer 3 0.10 1.6586 0.0000 0.0000 0.10 10000.32
7 2014.08.25 12:58 acheter 4 0.10 1.6590 0.0000 0.0000 0.00 10000.32
8 2014.08.26 13:13 fermer au stop 4 0.10 1.6576 0.0000 0.0000 -0.14 10000.18
8 - J'ai interrompu le travail en fermant le testeur.
Ensuite, nous examinons le "Journal" :
2014.10.31 07:46:44.837 GBPUSD,M15 : 4453 tick events (5608 bars, 340128 bar states) traités en 312876 ms (temps total 324436 ms)
2014.10.31 07:46:44.837 2014.08.26 13:13 Testeur : l'ordre n°4 est clos
2014.10.31 07:46:44.798 2014.08.26 13:13 Visual tester arrêté
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15 : ORDER OPEN 4
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15 : ouvert #4 acheter 0.10 GBPUSD à 1.6590 ok
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15 : Open #4 acheter 0.10 GBPUSD à 1.6590 ok
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15 : Je ne pense pas qu'il ait fermé. Nous y voilà : 4108
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15 : Erreur OrderClose 4108
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15 : ticket 3 inconnu pour la fonction OrderClose
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15 : clôture #3 achat 0.10 GBPUSD à 1.6576 au prix 1.6586
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15 : HOLD OPEN #3
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15 : ouvert #3 acheter 0.10 GBPUSD à 1.6576 ok
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15 : Ouvrir la position #1
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15 : Quoi de neuf ? Nous y voilà : 4108
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15 : Erreur OrderClose 4108
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15 : ticket 2 inconnu pour la fonction OrderClose
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15 : close #2 acheter 0.10 GBPUSD à 1.6564 au prix 1.6574
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15 : HOLD OPEN 2
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15 : open #2 buy 0.10 GBPUSD at 1.6564 ok
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15 : Ouverture de la première position
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15 : Quoi de neuf ? Nous y voilà : 4108
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15 : Erreur OrderClose 4108
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15 : ticket 1 inconnu pour la fonction OrderClose
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15 : clôture #1 achat 0.10 GBPUSD à 1.6550 au prix 1.6562
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15 : ORDER OPEN 1
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15 : ouvert #1 acheter 0.10 GBPUSD à 1.6550 ok
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15 : ouvert #1 acheter 0.10 GBPUSD à 1.6550 ok
2014.10.31 07:41:31.958 Entrées Ozero : gLot=0.1 ; gPoint=0.001 ;
Maintenant, je suis complètement perdu. D'une part, les ordres sont fermés comme vous pouvez le voir sur le graphique et dans les résultats, d'autre part, le code est exécuté avec des erreurs comme vous pouvez le voir dans le journal : (((((((((((.
Ozero.
Vous essayez de fermer le même ordre deux fois. Enlevez celui du haut.
Bonjour.
Suppression de deux lignes. Tout fonctionne. Et tout s'affiche correctement sur le graphique, dans les résultats et dans les journaux.
Question : lors de la compilation, il donne
"Ozero".mq4'Ozero.mq4 1 1
La valeur de retour de 'OrderClose' doit être vérifiée Ozero.mq4 46 13
0 erreur(s), 1 avertissement(s) 1 2
De quoi le compilateur me met-il en garde ? La 46ème ligne est OrderClose(OrderTicket(),OrderLots(),_Bid,15) ;
Ozero.
Pouvez-vous me dire ce qui pourrait causer le problème qui s'est produit aujourd'hui ?
L'EA a une option pour arrêter les transactions 15 minutes avant la fermeture du marché le vendredi.
Quand un nouveau jour apparaît, l'EA vérifie si c'est vendredi, alors aujourd'hui nous arrêtons le trading dans StringToTime("23:59")-15*60
Dans le testeur de stratégie, cette fonction fonctionne correctement. Cependant, dans le trading réel, je vois une situation totalement différente - le conseiller expert arrête le trading au premier tick lorsque le vendredi arrive.
Voici les impressions du journal d'Expert Advisor :
Courtier n°1, démo :
0 05:59:47.731 Scalper GBPAUDpt,M1 : Fin dans le vendredi = 2014.10.23 23:44:00
Courtier 2, réel :
0 03:00:11.999 Scalper EURUSD,M1 : Fin dans le vendredi = 2014.10.23 23:44:00
C'est-à-dire que lorsque la barre quotidienne d'aujourd'hui apparaît (vendredi 24 octobre) sur le premier tick, l'EA
convertira la ligne "23:59" en heure d'hier, au lieu de lui attribuer le jour d'aujourd'hui.
Toutefois, si le conseiller expert est redémarré le vendredi en milieu de journée, il déterminera correctement l'heure d'achèvement.
J'ai trouvé la raison de ce problème : https://forum.mql4.com/33023.
Comme prévu, il s'agit pratiquement d'un bug dans la fonction StringToTime. Tous les symptômes sont similaires. Cette fonction convertit la chaîne "23:59" en date avec la date du PC local mais pas avec la date de MT4. Et dans le testeur, comme nous le savons, la date du PC local est émulée et assimilée à l'heure du terminal. C'est pourquoi tout fonctionne correctement dans le testeur, mais la démo/le temps réel entraîne des problèmes et des pertes. Bien sûr, la documentation ne dit pas d'où vient la date et le lien ci-dessus montre que ce problème a été signalé il y a 4 ans, mais apparemment les methaquotes s'en moquent.
Une autre question. Est-ce que je comprends bien que :
1. la numérotation des commandes commence à partir de "0".
2. ce code fermera absolument tous les ordres, que je les ouvre manuellement ou par programme ? C'est-à-dire que nous ne trouverons jamais un ordre que cette partie du programme ne peut pas fermer ?
Ozero.
Quelqu'un a-t-il fait défiler du texte à l'écran ? Par exemple - la commande d'untel ouverte/fermée/modifiée, etc... Des nouvelles d'untel ou d'untel... ?
Si vous le voulez bien, montrez-moi un bout de code.
Merci !
Celle du bas est meilleure. L'ordre doit être choisi au préalable.
C'est mieux comme ça :
Quelqu'un a-t-il fait défiler du texte à l'écran ? Par exemple - la commande d'untel ouverte/fermée/modifiée, etc... Des nouvelles d'untel ou d'untel... ?
Si vous le voulez bien, montrez-moi un bout de code.
Senx !
Je faisais un défilement vertical dans une fenêtre d' indicateur vide. Voici la fonction :
Exemple d'utilisation d'un message en une seule couleur (vous pouvez avoir 4 couleurs sur une ligne pour différents mots) :
Il doit y avoir un indicateur vide nommé Win_Inform sur le graphique.