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

 
Vitaly Muzichenko:
Ce n'est pas clair. S'il est nécessaire d'arrêter l'EA, la variante proposée s'en charge, s'il n'est pas nécessaire de l'arrêter, alors laissez-le négocier et ne le limitez en aucune façon. Si l'on veut trader à la demande après le stop, il suffit de changer l'heure, Handicap deviendra vrai et le programme continuera à fonctionner.
Ok, merci.
 
trader781:
Ok, merci.

Vous voulez probablement avoir le choix de spécifier dans les paramètres d'entrée : "Traiter après la clôture, ou ne pas traiter après la clôture" ?

Si oui, alors voilà :

extern bool OneTrade = true;

// OnTick
if(OneTrade && !Disabled) return;

Je n'ai pas bousillé le drapeau.

 
Vitaly Muzichenko:

Vous voulez probablement avoir le choix de spécifier dans les paramètres d'entrée : "Traiter après la clôture, ou ne pas traiter après la clôture" ?

Si oui, alors voilà :

extern bool OneTrade = true;

// OnTick
if(OneTrade && !Disabled) return;

Je n'ai pas l'air d'avoir fait quelque chose de mal avec le drapeau.

Ok, je l'ai, c'est ce que j'ai manqué. Je pensais qu'une variable suffirait si elle était bien placée.
 
Vitaly Muzichenko:

Merci !

La question est : Dans quelle mesure cette entrée est correcte, elle se trouve au début du programme, alors que tout au long du programme, beaucoup de Time[0] et Time[1] sont utilisés, et ne doivent pas être appelés à chaque fois, ils sont écrits dans une variable. Il ne semble pas y avoir d'erreurs en dehors du tableau, mais tout est défini de manière superficielle :

datetime TM[], TIME0, TIME1;

//------------
void OnTimer()

ArraySetAsSeries(TM, true);
  if(CopyTime(_Symbol, PERIOD_CURRENT, 0, 2, TM)==-1) return;
   TIME0 = TM[0];
   TIME1 = TM[1];

Merci !

En gros, ça ne fait aucune différence si on accède à une variable ou à une cellule du tableau. Peut-être que c'est juste la vitesse d'acquisition, mais je pense que c'est microscopique, faire une mesure avec des variables et accéder directement au tableau.
 
Vitaly Muzichenko:

Je peux vous demander de l'ajuster un peu ?

Mettez une ligne verticale au prix actuel

ou un lien vers un EA où cela est disponible

Je veux comprendre comment distribuer les paramètres du robot pour le faire fonctionner.

 
trader781:

Je peux vous demander de l'ajuster un peu ?

Mettez une ligne verticale au prix actuel

ou un lien vers un EA où cela est disponible

Je veux comprendre comment distribuer les paramètres du robot pour qu'il fonctionne.

Tout d'abord, vous devez faire pivoter l'affichage des citations de 90 degrés.
 
Alexey Viktorov:
Vous devez d'abord faire pivoter l'affichage de la citation de 90 degrés.

Poste 998.

Je me fiche que ce soit horizontal ou vertical, c'est juste que ce que j'ai fait là ne fonctionne pas.

 
trader781:

Poste 998.

Je me fiche de savoir si c'est horizontal ou vertical, c'est juste que maintenant ce que j'ai fait ne fonctionne pas.

Non, désolé, je ne vais pas entrer dans le jeu.
 
J'ai remarqué que les gens demandent souvent une fonction de chalutage ou de seuil de rentabilité. J'ai créé une fonction blueprint pour déplacer un stop à un niveau breakeven donné et suivre une position stop par la valeur d'un indicateur, qui dessine ses lignes sur le graphique des prix (MA ou parabolique, par exemple), passé dans la fonction.

#property strict // в самое начало кода вашей программы (если нету там ещё)


// Функцию - за пределы остальных функций программы
//+------------------------------------------------------------------+
//| Трейлинг по значению + перенос стопа на уровень безубытка        |
//+------------------------------------------------------------------+
void TrailingByLevel(string symbol_name,           // Имя символа
                     int magic_number,             // Magic ордера
                     double level_of_trail,        // Уровень, на который ставим стоп (например МА или Parabolic SAR)
                     int trailing_start,           // Профит в пунктах для старта трала
                     int trailing_step,            // Шаг трала в пунктах
                     int trailing_stop,            // Отступ стоплосс от уровня МА или SAR в пунктах
                     int profit_for_breakeven=15,  // Профит в пунктах для переноса стопа в безубыток
                     int breakeven_level=5,        // Уровень безубытка в пунктах
                     bool use_trail=true,          // Флаг использования трала
                     bool use_breakeven=false      // Флаг использования безубытка
                     )
   {
   int lv=StopLevel(symbol_name)+1;                // Получаем значение Stop Level по символу + 1 пункт (из отдельной функции)
   for(int i=OrdersTotal()-1; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS)) {
         if(OrderMagicNumber()!=magic_number)   continue;         //Если Магик не наш - идем к следующему ордеру
         if(OrderSymbol()!=symbol_name)         continue;         //Если Символ не наш - идем к следующему ордеру
         //--- покупки
         if(OrderType()==OP_BUY) {
            int    digits=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
            double point=(SymbolInfoDouble(symbol_name,SYMBOL_POINT));
            double pb=SymbolInfoDouble(symbol_name,SYMBOL_BID);
            double profit=pb-OrderOpenPrice();                    // Профит позиции в цене (без комиссий и свопов)
            //--- безубыток
            if(use_breakeven) {
               //--- если профит в цене больше заданного
               if(profit>=profit_for_breakeven*point) {
                  int err=ERR_NO_ERROR;
                  double sl=NormalizeDouble(OrderOpenPrice()+breakeven_level*point,digits);
                  if(pb-lv*point>sl && OrderStopLoss()<sl) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                  if(err==ERR_MARKET_CLOSED) return;
                  }
               }
            //--- трал
            if(use_trail) {
               //--- если профит в пунктах больше заданного, или изначально задан меньше ноля
               if(profit>=trailing_start*point || trailing_start==EMPTY) {
                  int err=ERR_NO_ERROR;
                  double sl=NormalizeDouble(level_of_trail-trailing_stop*point,digits);  // вычисляем новый уровень стоплосс по значению, переданному в функцию
                  //--- Если новое значение СЛ не ближе Stop Level и если новое положение СЛ больше старого+шаг СЛ, то модифицируем стоп позиции
                  if(pb-lv*point>sl && OrderStopLoss()+trailing_step*point<sl) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                  if(err==ERR_MARKET_CLOSED) return;
                  }
               }
            }

         //--- Продажи
         if(OrderType()==OP_SELL) {
            int    digits=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
            double point=(SymbolInfoDouble(symbol_name,SYMBOL_POINT));
            double pa=SymbolInfoDouble(symbol_name,SYMBOL_ASK);
            double profit=OrderOpenPrice()-pa;                    // Профит позиции в цене (без комиссий и свопов)
            //--- безубыток
            if(use_breakeven) {
               //--- если профит в цене больше заданного
               if(profit>=profit_for_breakeven*point) {
                  int err=ERR_NO_ERROR;
                  double sl=NormalizeDouble(OrderOpenPrice()-breakeven_level*point,digits);
                  if(pa+lv*point<sl && (OrderStopLoss()>sl || OrderStopLoss()==0)) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                  if(err==ERR_MARKET_CLOSED) break;
                  }
               }
            //--- трал
            if(use_trail) {
               //--- если профит в пунктах больше заданного, или изначально задан меньше ноля
               if(profit>=trailing_start*point || trailing_start==EMPTY) {
                  int err=ERR_NO_ERROR;
                  double sl=NormalizeDouble(level_of_trail+trailing_stop*point,digits);  // вычисляем новый уровень стоплосс по значению, переданному в функцию
                  //--- Если новое значение СЛ не ближе Stop Level и если новое положение СЛ больше старого+шаг СЛ, то модифицируем стоп позиции
                  if(pa+lv*point<sl && (OrderStopLoss()-trailing_step*point>sl || OrderStopLoss()==0)) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                  if(err==ERR_MARKET_CLOSED) break;
                  }
               }
            }
         }
      }
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
   int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
   int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   return((lv==0)?sp*2:lv);
   }
//+------------------------------------------------------------------+
En général, si vous avez besoin de quelque chose, demandez. Ou correct.
 
Artyom Trishkin:
J'ai remarqué que les gens demandent souvent une fonction de chalutage ou de seuil de rentabilité. J'ai créé une fonction blueprint pour déplacer un stop à un niveau breakeven donné et suivre une position stop par la valeur d'un indicateur, qui dessine ses lignes sur le graphique des prix (MA ou parabolique, par exemple), passé dans la fonction.


En général, si vous avez besoin de quelque chose, demandez. Ou correct
Bonjour Artem, et qu'est-ce que vous ne placerez pas dans CodeBase ? Il y aura au moins un autre code correct.
Raison: