Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 101

 
Vitaly Muzichenko:
Non è chiaro. Se è necessario fermare l'EA, allora la variante suggerita fa fronte a questo, se non c'è bisogno di fermarlo, allora lasciatelo commerciare e non limitatelo in alcun modo. Se vogliamo fare trading su richiesta dopo lo stop, è sufficiente cambiare il tempo, Disabilitato diventerà vero e il programma continuerà a lavorare
Ok, grazie.
 
trader781:
Ok, grazie.

Probabilmente volete avere la scelta di specificare nei parametri di input: "Trade after close, or don't trade after close"?

Se è così, allora ecco qui:

extern bool OneTrade = true;

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

Non ho fatto casino con la bandiera.

 
Vitaly Muzichenko:

Probabilmente volete avere la scelta di specificare nei parametri di input: "Trade after close, or don't trade after close"?

Se è così, allora ecco qui:

extern bool OneTrade = true;

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

Non mi sembra di aver fatto nulla di male con la bandiera

Ok, ho capito, ecco cosa mi mancava. Ho pensato che una variabile sarebbe stata sufficiente se collocata correttamente.
 
Vitaly Muzichenko:

Grazie!

La domanda è: quanto è corretta questa voce, è all'inizio del programma, mentre in tutto il programma vengono usati molti Time[0] e Time[1], e non per essere chiamati ogni volta, è scritto in una variabile. Sembra che non ci siano errori al di fuori dell'array, ma tutto è definito superficialmente:

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];

Grazie!

Fondamentalmente, non fa alcuna differenza se si accede a una variabile o a una cella dell'array. Forse è solo la velocità di acquisizione, ma penso che sia microscopico, fare una misura con variabili e accedere direttamente all'array.
 
Vitaly Muzichenko:

posso chiederti di aggiustarlo un po'?

Metti una linea verticale al prezzo corrente

o un link a un EA dove questo è disponibile

Voglio capire come distribuire i parametri del bot per farlo funzionare

 
trader781:

posso chiederti di aggiustarlo un po'?

Metti una linea verticale al prezzo corrente

o un link a un EA dove questo è disponibile

Voglio capire come distribuire i parametri del bot per farlo funzionare

Per prima cosa, devi ruotare il display delle citazioni di 90 gradi.
 
Alexey Viktorov:
Per prima cosa devi ruotare il display della citazione di 90 gradi.

Posto 998.

Non mi interessa se è orizzontale o verticale, è solo che in questo momento quello che ho fatto lì non funziona

 
trader781:

Posto 998.

Non mi interessa se è orizzontale o verticale, è solo che ora quello che ho fatto non funziona

No, mi dispiace, non voglio entrarci.
 
Ho notato che la gente chiede spesso una funzione di strascico o di break-even. Ho creato una funzione blueprint per spostare uno stop ad un dato livello di breakeven e per tracciare una posizione di stop in base al valore di qualche indicatore, che disegna le sue linee sul grafico del prezzo (MA o parabolica, per esempio), passato nella funzione.

#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);
   }
//+------------------------------------------------------------------+
In generale, se c'è qualcosa da chiedere. O corretto.
 
Artyom Trishkin:
Ho notato che la gente chiede spesso una funzione di strascico o di break-even. Ho creato una funzione blueprint per spostare uno stop ad un dato livello di breakeven e per tracciare una posizione di stop in base al valore di qualche indicatore, che disegna le sue linee sul grafico del prezzo (MA o parabolica, per esempio), passato nella funzione.


In generale, se c'è qualcosa da chiedere. O corretto
Ciao Artem, e cosa in CodeBase non lo metterai? Ci sarà almeno un altro codice corretto.