Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 386

 

Hmm... Je n'avais pas pensé à changer les coordonnées. Merci pour le conseil.

Alors voici une question. Il existe une condition de point d'entrée. Je l'ai implémenté par le biais de variables statiques, afin qu'il ne soit pas remis à zéro à chaque tick. Eh bien, à certains endroits du graphique, le robot dessine un point d'entrée où il n'y a pas de niveaux horizontaux et, par conséquent, leur intersection avec la MA. Veuillez exécuter le code dans votre testeur et vous verrez le problème. Sur EURUSD. Peut-être ce problème doit-il être mis en œuvre d'une manière différente ? Je ne suis pas un pro de la programmation.

Autrement dit, le modèle est apparu, des niveaux ont été tracés et le robot attend trois croisements de l'un des niveaux.

Qu'en pensez-vous ?

 
voron_026:

Hmm... Je n'avais pas pensé à changer les coordonnées. Merci pour le conseil.

Alors voici une question. Il existe une condition de point d'entrée. Je l'ai implémenté par le biais de variables statiques, afin qu'il ne se remette pas à zéro à chaque tick. Eh bien, à certains endroits du graphique, le robot dessine un point d'entrée où il n'y a pas de niveaux horizontaux et, par conséquent, leur intersection avec la MA. Veuillez exécuter le code dans votre testeur et vous verrez le problème. Sur EURUSD. Peut-être ce problème doit-il être mis en œuvre d'une manière différente ? Je ne suis pas un pro de la programmation.

Autrement dit, le modèle est apparu, des niveaux ont été tracés et le robot attend trois croisements de l'un des niveaux.

Qu'en pensez-vous ?

Qui en a besoin, si je peux me permettre ? Regardez d'où le robot tire ses valeurs et vous trouverez une autre solution au problème.

 

Help Two donne des erreurs ! J'ai souligné les erreurs en rouge, aidez moi PLZ !



//+------------------------------------------------------------------+

//| Trailing Stop by Asyll.mq4 |

//| Copyright 2017, MetaQuotes Software Corp.

//| https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "Alibek Asyll"

#lien de propriété "https://www.mql4you.com"


extern int TralType = 0 ; // 0-Sar, 1-ATR, 2-HMA.

extern double SAR_Step = 0.02 ;

extern double SAR_Max = 0.2 ;

extern int ATR_Period = 14 ;

extern double ATR_K = 2.0 ;

extern inttern MMA_Period = 16 ;

extern int MMA_Method = 3 ;

extern inttern MMA_Shift = 0 ;

datetime LBT ;

//+------------------------------------------------------------------+

//| Fonction d' initialisation de l'expert |

//+------------------------------------------------------------------+

int init()

{

//---

//---

retour(0) ;

}

//+------------------------------------------------------------------+

//| Fonction de désinitialisation experte |

//+------------------------------------------------------------------+

int deinit()

{

//---

retour(0) ;

}

//+------------------------------------------------------------------+

//| fonction tick expert |

//+------------------------------------------------------------------+

int start()


{

bool error = false ;

si (LBT!=Time[0] {

si (OrdersTotal()>0) {

for (int i=o ; i<OrdersTotal() ; i++) {

if (OrderSelect(i,SELECT_BY_POS)&&OrderSymbol()==Symbol()&&OrderType()<2) {

double SL = OrderStopLoss() ;

if (OrderType()==0) {

switch (TralType) {

cas 0 : SL = iSAR(NULL,0,SAR_Step, SAR_Max,0) ;

pause ;

cas 1 : SL = High[1] - iATR(NULL,0,ATR_Period,1)*ATR_K ;

pause ;

cas 2 : SL = iCustom(NULL,0, "VininI_HMA_sound&amp",HMA_Period, HMA_Method, 3, HMA_Shift,false,false,",1,0,0) ;

pause ;

}

si (SL<OrderStopLoss())

SL = OrderStopLoss() ;

}

si (OrderType()==1){

switch (TralType){

cas 0 : SL = iSAR(NUll,0,SAR_Step, SAR_Max,0) ;

pause ;

cas 1 : SL = Low[1] + iATR(NULL,0,ATR_Period,1)*ATR_K ;

pause ;

cas 2 : SL = iCustom(NULL,0, "VininI_HMA_sound&amp",HMA_Period, HMA_Method, 2, HMA_Shift,false,false,",1,0,0) ;

pause ;

}

si (SL>OrderStopLoss())

SL = OrderStopLoss() ;

}

si (SL!=OrderStopLoss()) {

si (!OrderModify(OrderTicket(),OrderOpenPrice(),OrderTakeProfit(),0))

erreur = vrai ;

}

}

si (!error)

LBT = Time[0] ;

}


retour() ;

}

//+-------------------------------------------------------------------+

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
Выберите подходящую торговую стратегию и оформите подписку на нее в пару кликов. Все Сигналы сопровождаются подробной статистикой и графиками. Станьте Поставщиком торговых сигналов и продавайте подписку тысячам трейдеров по всему миру. Наш сервис позволит вам хорошо зарабатывать на прибыльной стратегии даже при небольшом стартовом капитале...
 
Asyll: L'aide deux donne des erreurs ! Erreurs surlignées en rouge, aide PLZ !

Il est logique d'utiliser le bouton SRC pour insérer du code. Signaler le texte des erreurs. Supprimez le texte pour accélérer le travail de l'examinateur :

//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+

int init()

  {

//---

   

//---

   return(0);

  }

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

int deinit()

  {

//---

   return(0);

  }

Il faut du temps pour appeler ces fonctions - et elles sont vides. Et il serait plus facile de travailler avec le texte du programme sans eux. Comptez les accolades. Pour vous faciliter la tâche, essayez le stylet dans le menu Outils. Jetez les lignes vides.

Стилизатор - Работа с исходным кодом - Разработка программ - Справка по MetaEditor
Стилизатор - Работа с исходным кодом - Разработка программ - Справка по MetaEditor
  • www.metatrader5.com
Данная функция предназначена для оформления исходного кода в соответствии с рекомендуемым стандартом. Это позволяет сделать код более читаемым, выглядящем профессионально. Грамотно оформленный код гораздо проще анализировать в последующем как его автору, так и другим пользователям. Для того чтобы запустить стилизатор, необходимо выполнить...
 

Bonne journée à tous.

J'ai une idée simple que j'essaie de coder et de tester sur un testeur MT-4

Ouvrir des ordres lorsque les conditions suivantes sont présentes en même temps

1. A l'ouverture d'une bougie d'une minute

2 Au prix que je veux

3. à la date souhaitée

4.la valeur du prix doit coïncider strictement avec la valeur du jour.

Par exemple, le 27ème jour était un chandelier d'une minute avec un prix d'ouverture de 1,2414.

J'ai besoin d'ouvrir un ordre 1) sur le chandelier ouvert 2) à 1.2414 3) mais le jour suivant qui suit le 27.

Par exemple, le 28, nous avons eu un chandelier d'une minute ouvert à 1,2438.

J'ai besoin d'ouvrir un ordre 1) sur le chandelier ouvert 2) à 1.2438 3) MAIS LE JOUR SUIVANT APRES LE 28.

Par exemple, le 12, il y avait un chandelier de 1 minute ouvert à 1.2451.

J'ai besoin d'ouvrir un ordre 1) sur le chandelier ouvert 2) à 1.2451 3) MAIS LE JOUR SUIVANT APRES LE 12.


Pour réaliser cette idée, j'ai commencé à étudier le thème des tableaux et j'ai créé deux tableaux unidimensionnels, mais cela ne fonctionne pas.

Je vous serais très reconnaissant si vous pouviez corriger mon code pour mettre en œuvre l'idée ci-dessus.

Je suis lent à comprendre, donc je vous serais très reconnaissant si vous pouviez écrire le bon code, au lieu de l'expliquer en mots.

De cette façon, je le comprendrai beaucoup plus vite.

Voici mon code.

double mass[3]=
{
1.2414,
1.2438,
1.2451
};
int mass1[3]=
{
27,
28,
12
};
double value = NormalizeDouble( Bid,4) ;
double S = ArrayBsearch(mass,  value,  WHOLE_ARRAY,  0, MODE_ASCEND);
int value1 = Day() ;
int S1 = ArrayBsearch(mass1,  value1, WHOLE_ARRAY,  0, MODE_ASCEND);

if(Bid  == iOpen(NULL,PERIOD_M1,0))
if(Day()!= S1)
if(NormalizeDouble ( Bid,4)== S)
{
OrderSend(Symbol(),OP_SELL,0.1,Bid ,3,Ask+400*Point,Ask-200*Point,"jfh",123 );
}
 

Bonjour ! Ce code est destiné à déplacer les niveaux de signal lorsque le prix se déplace au-delà du niveau supérieur ou inférieur, mais cela ne se produit pas. Veuillez me dire quelle est l'erreur.

/-------------------------выход цены за пределы сигнальных уровней-----------------------------------------------------------------------------------------------
if(Bid>=priceA){                                                                                   //если цена вышла за верхнею границу, то переместить сердцевину в новое положение
 ObjectsDeleteAll();
 OR=0;                                                                                             //переменная ордера обнуляется для поиска ситуации открытия новых ордеров
 }                                                                                                 
if(Bid<=priceB){                                                                                   //если цена вышла за нижнею границу, то переместить сердцевину в новое положение
 ObjectsDeleteAll();
 OR=0;                                                                                             //переменная ордера обнуляется для поиска ситуации открытия новых ордеров
 } 
 //----------------------------------------------------------------------------------------------------------------------------------------------------------------
 price=iHigh(Symbol(),PERIOD_M15,0);                                                               //Сигнальный уровень О(Сердцевина)
ObjectCreate("UrO",OBJ_HLINE,0,0,price);
ObjectSet("UrO",OBJPROP_COLOR,clrYellowGreen);                               
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
 priceA=price+30*Point;                                                                            //Сигнальный уровень А(Максимум)
ObjectCreate("UrA",OBJ_HLINE,0,0,priceA);
ObjectSet("UrA",OBJPROP_COLOR,clrDarkSlateBlue); 
//---------------------------------------------------------------------------------------------------------------------------------------------------------------- 
 priceB=price-30*Point;                                                                            //Сигнальный уровень B(Минимум)
ObjectCreate("UrB",OBJ_HLINE,0,0,priceB); 
ObjectSet("UrB",OBJPROP_COLOR,clrOrangeRed); 
 
ANDREY: Par exemple, le 27, il y avait une bougie d'une minute avec le prix ouvert de 1,2414.

J'ai besoin d'ouvrir un ordre 1) à l'ouverture d'une bougie 2) à 1.2414 3) MAIS LE DERNIER JOUR APRES LE 27.

Voici mon code.

Premièrement, il n'est guère raisonnable de normaliser un DIS déjà normalisé, à moins que l'instructeur ne vous dise de le faire...

Deuxièmement, qu'est-ce qu'on obtient ? Le 27, le prix apparaît et vous entrez d'urgence les données dans le tableau, pour le déclencher le 28 ? Et si le 28, quelque chose d'urgent se produit ? Tu mets des données dans un tableau qui est difficile à calculer. Vos données doivent être calculables. Je vous suggère de déboguer votre EA par étapes. 1) Déterminez le prix requis et affichez-le à l'aide de la fonction Alert(). Si vous êtes sûr qu'elle est correcte, calculez et affichez la suivante... et ainsi de suite jusqu'à la fin. Il est trop tôt pour écrire tout le code à l'avance car il devra être modifié au fur et à mesure du débogage. Que pensez-vous de cette technologie du simple au complexe ?

 
vikzip: Le code a été écrit pour déplacer les niveaux de signal lorsque le prix dépasse le niveau supérieur ou inférieur, mais cela ne se produit pas.

Voyons ce qui est écrit ici. Premièrement, les lignes devraient être plus courtes. Ils s'afficheront mieux à l'écran et le compilateur travaillera plus rapidement.

/-------------------------выход цены за пределы сигнальных уровней-------------------------------------------------
if(Bid>=priceA){                  //если цена вышла за верхнею границу, то переместить сердцевину в новое положение
 ObjectsDeleteAll();
 OR=0;                            //переменная ордера обнуляется для поиска ситуации открытия новых ордеров
 }
if(Bid<=priceB){                  //если цена вышла за нижнею границу, то переместить сердцевину в новое положение
 ObjectsDeleteAll();
 OR=0;                            //переменная ордера обнуляется для поиска ситуации открытия новых ордеров
 } 
 //----------------------------------------------------------------------------------------------------------------
Si la DIB est plus importante, vous devez faire quelque chose. Ensuite, si la DIS est inférieure, la même chose doit être faite. Vous pouvez le formuler plus brièvement : si le prix est plus ou moins élevé, alors ...
Vous écrivez quelque chose dans les commentaires à propos du déplacement de quelque chose, mais tout ce que vous faites est de supprimer tous les objets. Vos 10 lignes sont remplacées par quatre.
if((Bid>=priceA) ||(Bid<=priceB)){     //если цена вышла за одну из ГРАНИЦ, то удалить все объекты и очистить признак поиска
   ObjectsDeleteAll();
   OR=0;                               // А это для чего?????????????????
} 

Mais ! !! Le signe OR devrait être utilisé ailleurs, n'est-ce pas ? Il semble qu'au lieu de mettre à zéro cet OR, nous devrions créer de nouveaux objets ici. Ou encore plus simple : au lieu de supprimer des objets, il suffit de les déplacer vers un nouvel emplacement - cela ne représente que 3 lignes de code. Ou l'instructeur exige-t-il plus ?

if((Bid>=priceA) ||(Bid<=priceB)){     //если цена вышла за одну из ГРАНИЦ, сдвинуть уровни
  ObjectSet("UrO",OBJPROP_PRICE1,iHigh(Symbol(),PERIOD_M15,0));   // Так что ли???
   Objectsset( аналогично)
   Objectsset(     )
}
Du simple au faux ou vice versa ?
 
STARIJ:

Tout d'abord, la normalisation d'une DIS déjà normalisée n'est guère recommandée, à moins que le professeur ne vous dise de le faire.

Deuxièmement, qu'avons-nous ici ? Le 27, un prix se produit et vous entrez d'urgence les données dans le tableau, pour qu'il fonctionne le 28 ? Et s'il y a une situation urgente le 28 ? Tu mets des données dans un tableau qui est difficile à calculer. Vos données doivent être calculables. Je vous suggère de déboguer votre EA par étapes. 1) Déterminez le prix requis et affichez-le à l'aide de la fonction Alert(). Si vous êtes sûr qu'elle est correcte, calculez et affichez la suivante... et ainsi de suite jusqu'à la fin. Il est trop tôt pour écrire tout le code à l'avance car il devra être modifié au fur et à mesure du débogage. Que pensez-vous de cette technologie du simple au complexe ?

Merci beaucoup pour l'astuce.

Mais il me semble que dans votre raisonnement vous supposez que j'essaie d'écrire un VRAI EA.

Je suis désolé de ne pas vous avoir dit que ce n'était pas le cas.

J'essaie de tester la présence d'une certaine régularité, d'une corrélation entre les paramètres ci-dessus, c'est-à-dire de confirmer ou de rejeter l'idée, qui peut être la base d'un Conseiller Expert TORKING.

Je vous serai donc reconnaissant de bien vouloir corriger mon code, afin que tout soit conforme à mon idée ci-dessus.

Et vos commentaires me seront bien sûr utiles lorsque je rédigerai un conseiller expert pour le commerce.

Merci.

 
ANDREY:

Merci beaucoup pour le conseil.

Mais ce que je vois, c'est que dans votre raisonnement, vous supposez que j'essaie d'écrire un VRAI EA.

Je suis désolé de ne pas vous avoir dit que ce n'était pas le cas.

J'essaie de tester la présence d'une certaine régularité, d'une corrélation entre les paramètres ci-dessus, c'est-à-dire de confirmer ou de rejeter l'idée, qui peut être la base d'un Conseiller Expert TORKING.

Je vous serai donc reconnaissant de bien vouloir corriger mon code, afin que tout soit conforme à mon idée ci-dessus.

Vos commentaires me seront bien sûr utiles lorsque je rédigerai un conseiller expert pour le commerce.

Merci.

Désolé pour l'intrusion. Mais... En quoi la logique de traçage des lignes devrait-elle être différente pour une EA commerciale et non commerciale ?

Lorsque vous êtes au travail, regardez-vous votre montre différemment de la façon dont vous la regardez à la maison ?