Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 101

 
Vitaly Muzichenko:
No está claro. Si es necesario detener el EA, entonces la variante sugerida hace frente a esto, si no hay necesidad de detenerlo, entonces déjelo operar y no lo limite de ninguna manera. Si queremos operar a la carta después del stop, basta con cambiar la hora, Disabled se hará realidad y el programa seguirá funcionando
Bien, gracias.
 
trader781:
Bien, gracias.

Probablemente quiera tener la opción de especificar en los parámetros de entrada: "Operar después del cierre, o no operar después del cierre"?

Si es así, aquí tienes:

extern bool OneTrade = true;

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

No me equivoqué con la bandera.

 
Vitaly Muzichenko:

Probablemente quiera tener la opción de especificar en los parámetros de entrada: "Operar después del cierre, o no operar después del cierre"?

Si es así, aquí tienes:

extern bool OneTrade = true;

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

No parece que haya hecho nada malo con la bandera

Vale, ya lo tengo, eso es lo que me faltaba. Pensé que una variable sería suficiente si estaba bien colocada.
 
Vitaly Muzichenko:

Gracias.

La pregunta es: ¿Qué tan correcta es esta entrada, está al principio del programa, mientras que a lo largo del programa se utiliza mucho Time[0] y Time[1], y no para ser llamado cada vez, se escribe en una variable. Parece que no hay errores fuera de la matriz, pero todo está definido 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];

Gracias.

Básicamente, da igual acceder a una variable o a una celda del array. Quizá sea sólo la velocidad de adquisición, pero creo que es microscópica, hacer una medición con variables y acceder al array directamente.
 
Vitaly Muzichenko:

¿puedo pedirte que lo ajustes un poco?

Poner una línea vertical en el precio actual

o un enlace a un EA donde esté disponible

Quiero entender cómo distribuir los parámetros del bot para que funcione

 
trader781:

¿puedo pedirte que lo ajustes un poco?

Poner una línea vertical en el precio actual

o un enlace a un EA en el que esté disponible

Quiero entender cómo distribuir los parámetros del bot para que funcione

En primer lugar, hay que girar la pantalla de las cotizaciones 90 grados.
 
Alexey Viktorov:
Primero tienes que girar la pantalla de la cita 90 grados.

Puesto 998.

Me da igual que sea horizontal o vertical, es que ahora mismo lo que hice ahí no funciona

 
trader781:

Puesto 998.

Me da igual que sea horizontal o vertical, es que ahora lo que he hecho ahí no funciona

No, lo siento, no voy a entrar en ello.
 
Me he dado cuenta de que la gente suele pedir una función de arrastre o de equilibrio. He creado una función para mover un stop a un nivel de equilibrio dado y para seguir una posición de stop por el valor de algún indicador, que dibuja sus líneas en el gráfico de precios (MA o parabólica, por ejemplo), pasado a la función.

#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 general, si hay algo - pregunta. O correcto.
 
Artyom Trishkin:
Me he dado cuenta de que la gente suele pedir una función de arrastre o de equilibrio. He creado una función para mover un stop a un nivel de equilibrio dado y para seguir una posición de stop por el valor de algún indicador, que dibuja sus líneas en el gráfico de precios (MA o parabólica, por ejemplo), pasado a la función.


En general, si hay algo - pregunta. O correcto
Hola Artem, ¿y en qué CodeBase no lo vas a colocar? Al menos habrá un código correcto más.
Razón de la queja: