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

 

¿Qué es el DecreaseFactor en el asesor estándar de MT en mashcats?

lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
 
Nerd Trader #:

Es extraño, los botones están ahí ahora. Y el desorden del código, porque es un borrador. En fin, ya he hecho una versión que funciona, lo último que queda es borrar los botones, aquí de nuevo empezó esta mierda: la función de borrar no encuentra ninguno de los 4 objetos.

Al hacer clic en el botón se crean todas las líneas:

Si se pulsa el botón - borrar:

Menuda chorrada se ha escrito, siento decirlo.

 
Artyom Trishkin #:

Y no es necesario ver los eventos. No funcionan en absoluto en el probador. Hay que vigilar el estado.

UPD. No es modesto, por supuesto, pero si hubieras escuchado mis consejos por una vez, lo habrías hecho todo hace tiempo. De forma adecuada y sin las muletas de un multipiso.

Pero cada uno elige el abismo en el que quiere sumergirse.

Mihail Matkovskij #:

Para usar la depuración en el probador, aprende a escribir en MQL5. Todo funciona allí.

No hay cambio de nombre de los objetos. Piense en ello como la sustitución de un objeto existente por uno nuevo.

Esto no puede ser. Tu código parece un lío de cosas. Probablemente por eso experimentas retrasos con los botones. Como te dije antes, empieza con algo sencillo. No complique demasiado las cosas. Y complicarlo poco a poco cuando lo sencillo empiece a funcionar y tengas confianza en ello.

¿Y cómo puedo ver los estados si se activan por evento (por clic)? Sí, pero estoy escribiendo en mql4, es lo mismo que decir "aprende a escribir en c# donde la depuración funciona".

"Correcta y sin muletas de varios pisos. "Así que esconder objetos es sólo una muleta.

Todo lo que he hecho, todo funciona https://gist.github.com/satorkain/0cf7a8df8ec1f4b3191defd04c94a418
Al hacer clic en el botón de todas las líneas se crean a la vez, a continuación, se ocultan y sólo uno se deja en función de la ubicación del panel de botones. Otras líneas se ocultan/mostran dependiendo de la ubicación del cursor en relación con el precio.

P.D.

Si no fuera por mql4 torcido no habría tenido que salir con esta tontería de ocultar objetos, todo debería haber funcionado a la primera con el borrado/renombrado de objetos.

stop order button (public).mq4
stop order button (public).mq4
  • gist.github.com
GitHub Gist: instantly share code, notes, and snippets.
 
Nerd Trader #:

¿Y cómo puedo ver los estados si se activan por evento (por clic)? Si pero yo escribo en mql4, es lo mismo que decir "aprende a escribir en c# donde la depuración funciona".

"Correcta y sin muletas de varios pisos. " Así que esconder objetos es sólo una muleta.

Todo lo que he hecho, todo funciona https://gist.github.com/satorkain/0cf7a8df8ec1f4b3191defd04c94a418
Al hacer clic en el botón de todas las líneas se crean a la vez, a continuación, se ocultan y sólo uno se deja en función de la ubicación del panel de botones. Otras líneas se ocultan/mostran dependiendo de la ubicación del cursor en relación con el precio.

P.D.

Si no fuera por el mql4 torcido, no habría tenido que salir con esta tontería de ocultar objetos, todo debería haber funcionado a la primera con el borrado/renombrado de objetos también.

Ocultar un objeto es sólo el método recomendado por el desarrollador. Y hay una propiedad especial para ello. Para ver el estado, hay que mirar la propiedad "State" del botón.

Lo que está torcido aquí es tu lógica y la sustitución de nociones - tomas los medios recomendados por el desarrollador como una muleta, y tomas la constante creación/borrado de objetos como código puro, pero eso es exactamente lo que es una muleta, saltarse el método rápido recomendado.

Por cierto, para poner rápidamente un objeto encima de todos los demás, tienes que hacerlo invisible, e inmediatamente visible - esto anulará su posición en la lista de objetos, y estará en la parte superior.

ZS. E incluso allí, en el git, publicaste el código con un C-menos. Totalmente propenso a errores. Una sola línea no se crea y todo se derrumba. Eso fue inmediatamente evidente. Creas líneas en el manejador de eventos - ¿para qué? ¿Para qué necesitas OnInit()? Lo has creado, has comprobado su éxito, has puesto una bandera y lo has ocultado. En OnDeinit() ha borrado los objetos creados por su programa. Para ello, también es necesario el prefijo del nombre.

Sólo se muestra y oculta en el manejador de eventos - no debería haber ninguna construcción. En su caso, exactamente.

Me daría vergüenza publicar algo así en el dominio público en git. Pero eso es para mí.

¿Y tú? ¿Está bien que la gente se aproveche de ello?

 
Artyom Trishkin #:

Ocultar un objeto es exactamente el método recomendado por el desarrollador. Y hay una propiedad especial para ello. Para ver el estado, hay que mirar la propiedad "State" del botón.

Lo que está torcido aquí es tu lógica y la sustitución de nociones - tomas los medios recomendados por el desarrollador como una muleta, y tomas la constante creación/eliminación voraz de objetos como código puro, pero eso es exactamente lo que es una muleta para eludir el método rápido recomendado.

Por cierto, para poner rápidamente un objeto por encima de todos los demás, tienes que hacerlo invisible, e inmediatamente visible - esto redefinirá su posición en la lista de objetos, y estará en la parte superior.

ZS. E incluso allí, en el git, publicaste el código con un C-menos. Totalmente propenso a errores. Una vez que no se crea una línea, todo se derrumba. Eso fue inmediatamente evidente. Creas líneas en el manejador de eventos - ¿para qué? ¿Para qué necesitas OnInit()? Lo has creado, has comprobado su éxito, has puesto una bandera y lo has ocultado. En OnDeinit() ha borrado los objetos creados por su programa. Para ello también es necesario el prefijo del nombre.

Sólo se muestra y oculta en el manejador de eventos - no debería haber ninguna construcción. En su caso, exactamente.

Me daría vergüenza publicar algo así en el dominio público en git. Pero eso es para mí.

¿Y tú? ¿Está bien que la gente se aproveche de ello?

¿Queremos crear una línea de 4 según sea necesario? :) ¿Y si hay 200 líneas? ¿Será económico crearlos todos a la vez según su lógica? Y la forma en que fue concebida por los desarrolladores sólo la conocen ellos, y concebida de forma muy poco intuitiva. Como si no hiciera falta nada increíble o ilógico. ¿Cómo podía saber que debía trabajar con los objetos sólo de esta manera y no de otra? ¿Tal vez de un libro de texto sobre mql4? Dudo que este punto se explique allí.

Al menos, funciona como estaba previsto :) Está entre paréntesis en el título (público), así que aún no está completo, pero sí, no hay comprobación para crear objetos, vamos a arreglarlo. Y lo he publicado en git sólo porque no me acordaba de pegar la papelera. ¿Avergonzado? El Git fue creado para que la gente aprenda, intercambie experiencias, comparta código, que funcione o no, da igual, cualquiera puede hacer un fork y hacer cambios si no está contento con algo.

Aquí está, 250 objetos han sido creados y almacenados en la memoria para la duración del Asesor Experto. Bueno, gracias, lo sabré . A esto me refiero con "lógica no intuitiva". Por ejemplo, en el tutorial sobre OnInit(), sólo se puede leer que la función se procesa durante la inicialización del Asesor Experto/indicador.

 
Nerd Trader #:


Déjame contarte un secreto. Puedes crear hasta 1.000 objetos o más, siempre que no tengas una "calculadora". Pero también puede hacerlo. Una calculadora es un ordenador con 4 GB de RAM. Cualquier cosa por debajo de eso es "la calculadora de la abuela"... :) Así, puedes crear objetos de una sola vez o de uno en uno. No hay ninguna diferencia. Pero sin fanatismo.

Así, todo funciona para todos si se hace con sabiduría...

 
Nerd Trader #:

¿Va a crear una línea de 4 según sea necesario? :) ¿Y si hay 200 líneas? ¿Sería económico crearlos todos a la vez según su lógica? Y la forma en que fue concebida por los desarrolladores sólo la conocen ellos, y concebida de forma muy poco intuitiva. Como si no hiciera falta nada increíble o ilógico. ¿Cómo podía saber que debía trabajar con los objetos sólo de esta manera y no de otra? ¿Tal vez de un libro de texto sobre mql4? Dudo que este punto se explique allí.

Al menos, funciona como estaba previsto :) Está entre paréntesis en el título (público), así que aún no está completo, pero sí, no hay comprobación para crear objetos, vamos a arreglarlo. Y lo he publicado en git sólo porque no me acordaba de pegar la papelera. ¿Avergonzado? El Git fue creado para que la gente aprenda, intercambie experiencias, comparta código, que funcione o no, da igual, cualquiera puede hacer un fork y hacer cambios si no está contento con algo.

Aquí está, 250 objetos han sido creados y almacenados en la memoria para la duración del Asesor Experto. Muy bien, gracias, lo sabré . A esto me refiero con "lógica no intuitiva". Puede leer en el tutorial, por ejemplo, sobre OnInit(), que la función se procesa durante la inicialización de un EA/indicador.

Puedes crear tantos objetos como necesites al mismo tiempo. En ese momento MT no estaba muy desarrollado en cuanto al dibujo de los buffers de los indicadores, teníamos que dibujar 400 velas visibles con líneas de tendencia, para una vela necesitamos 5 líneas, 400*5=2000, más un objeto para cada una y así sucesivamente. En total tenemos unos 2500 objetos. Funcionó sin ningún tipo de matiz.

No entiendes del todo la lógica del trabajo con objetos, pero sabes cómo argumentar. Es mejor hacer lo contrario.

 
Nerd Trader #:

¿Va a crear una línea de 4 según sea necesario? :) ¿Y si hay 200 líneas? ¿Sería económico crearlos todos a la vez según su lógica? Y la forma en que fue concebida por los desarrolladores sólo la conocen ellos, y concebida de forma muy poco intuitiva. Como si no hiciera falta nada increíble o ilógico. ¿Cómo podía saber que debía trabajar con los objetos sólo de esta manera y no de otra? ¿Tal vez de un libro de texto sobre mql4? Dudo que este punto se explique allí.

Al menos, funciona como estaba previsto :) Está entre paréntesis en el título (público), así que aún no está completo, pero sí, no hay comprobación para crear objetos, vamos a arreglarlo. Y lo publiqué en git sólo porque no me acordaba de pegar la papelera. ¿Avergonzado? El Git fue creado para que la gente aprenda, intercambie experiencias, comparta código, que funcione o no, da igual, cualquiera puede hacer un fork y hacer cambios si no está contento con algo.

Aquí está, 250 objetos han sido creados y almacenados en la memoria para la duración del Asesor Experto. Muy bien, gracias, lo sabré . A esto me refiero con "lógica no intuitiva". Por ejemplo, en el tutorial sobre OnInit(), sólo se puede leer que la función se procesa durante la inicialización del Asesor Experto/indicador.

Bienvenido. Intentaré explicarlo en un ruso sencillo.

Te vas de viaje de pesca.

  1. En casa abres la despensa, te rascas la cabeza y la cierras.
  2. Vas a pescar y necesitas una caña de pescar.
  3. Vas a casa, al almacén, a por una caña de pescar.
  4. Fuiste a pescar, lanzaste tu caña y atrapaste un pez, y luego necesitaste una red
  5. Fui a casa al almacén para la red
  6. Fuiste a pescar, recogiste el pescado que habías capturado y que flotaba en el anzuelo con la red, y necesitabas un recipiente para guardar el pescado que habías capturado
  7. Ir a casa para ..... ¿Continúo?

O puedes coger todo lo que necesites de la despensa (OnInit) directamente, pescar sin dar vueltas y, cuando llegues a casa, poner todo en la despensa y la nevera (OnDeinit).

Esposible que lo haya conocido aquí en el foro. Sólo hay que escuchar y oír lo que se dice a veces.

Si no es así, te hacen una pregunta, te contestan, dices "tonterías" y haces lo que piensas.

Primero hay que reflexionar sobre la cuestión, hacer preguntas y luego empezar a editar.

¿Sabe que lo más sencillo en programación es imprimir el código? Y la mayor parte del desarrollo es pensar en la lógica.

 

Siento sacar esto a colación por segunda vez.

Pero hay un problema que aún no puedo resolver, a saber

abrir una serie de órdenes (una tras otra) en la misma vela.

Necesito evitar que el EA abra una nueva orden en la misma vela.

Pensé en resolverlo usando Sleep(), pero Makar dijo que sería mejor no detener el proceso.

problema.

El código ahora se ve así:

// Параметры советника
input string  sParametersEA = "";     // Параметры советника
input double  Lot           = 0.01;   // Количество лотов
input int     StopLoss      = 30;     // Уровень убытка
input int     TakeProfit    = 30;     // Уровень прибыли
input int     Slippage      = 3;      // Проскальзование (в пунктах)
input int     Magic         = 1;      // Индентификатор советника
input double  K_Martin1     = 2.0;    // Множитель мартин 1
input double  K_Martin2     = 2.0;    // Множитель мартин 2
input double  K_Martin3     = 2.0;    // Множитель мартин 3
input int     OrdersClose   = 5;      // Ограничение лотности мартин1
input int     OrdersClose2  = 5;      // Ограничение лотности мартин2
input int     DigitsLot     = 2;      // Точность лотности
// Параметры индикатора
input string  sParametersMA = "";     // Параметры индикатора
input int     PeriodMA      = 14;     // Период мувинга
input int     MovingShift   = 1;      // Сдвиг мувинга
// Глобальные переменные
string AC;
datetime Start;
double dMA;
double MaxMartinLot;
double MaxMartinLot2;
//+-----------------------------------------------------------------------------------------------+
int OnInit()
  {
Start          = TimeCurrent();
MaxMartinLot   = Lot*MathPow(1.4,OrdersClose);
MaxMartinLot2  = Lot*MathPow(K_Martin2,OrdersClose2);
AC             = StringConcatenate(" ", AccountCurrency());
return(INIT_SUCCEEDED);
  }
//+-----------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+-----------------------------------------------------------------------------------------------+
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
   }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция проверки открытых оредров |
//+-----------------------------------------------------------------------------------------------+
int CountOrders() 
  {
   int cnt=0;
   int i=OrdersTotal()-1;
   for(int pos=i;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol)
           {
            if(OrderMagicNumber()==Magic) cnt++;
           }
        }
     }
   return(cnt);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на покупку |
//+-----------------------------------------------------------------------------------------------+
bool bSignalBuy()
  {
   if(dMA > Open[1] && dMA < Close[1])  //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика.
      return(true);

   return(false);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на продажу |
//+-----------------------------------------------------------------------------------------------+
bool bSignalSell()
  {
   if(dMA < Open[1] && dMA > Close[1])
      return(true);

   return(false);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на покупку |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenBuy()
  {
// Тикет ордера
   int iOTi = 0;   

   iOTi = OrderSend(Symbol(), OP_BUY, LOT(), Ask, Slippage, 0, 0, "", Magic, 0, clrNONE);
   
// Проверим открылся ли ордер
   if(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
      vOrderModify(iOTi);
   else
// Если нет, то получим ошибку
      vError(GetLastError());
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на продажу |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenSell()
  {
// Тикет ордера  
   int iOTi = 0;   
//Print(bCheckOrders());
   iOTi = OrderSend(Symbol(), OP_SELL, LOT(), Bid, Slippage, 0, 0, "", Magic, 0, clrNONE);

// Проверим открылся ли ордер
   if(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
      vOrderModify(iOTi);
   else
// Если нет, то получим ошибку
      vError(GetLastError());
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                                    Функция модификации ордера |
//+-----------------------------------------------------------------------------------------------+
void vOrderModify(int iOTi)
  {
   int    iOTy = -1;    // Тип ордера
   double dOOP = 0;     // Цена открытия ордера
   double dOSL = 0;     // Стоп Лосс
   int    iMag = 0;     // Идентификатор советника
   double dSL  = 0;     // Уровень убытка
   double dTP  = 0;     // Уровень прибыли

// Выберем по тикету открытый ордер, получим некоторые значения
   if(OrderSelect(iOTi, SELECT_BY_TICKET, MODE_TRADES))
     {
      iOTy = OrderType();
      dOOP = OrderOpenPrice();
      dOSL = OrderStopLoss();
      iMag = OrderMagicNumber();
     }

// Если ордер открыл данный советник, то входим в условие
   if(OrderSymbol() == Symbol() && OrderMagicNumber() == iMag)
     {
// Если Стоп Лосс текущего ордера равен нулю, то модифицируем ордер
      if(dOSL == 0)
        {
         if(iOTy == OP_BUY)
           {
            dSL = NormalizeDouble(dOOP - StopLoss * Point, Digits);
            dTP = NormalizeDouble(dOOP + TakeProfit * Point, Digits);

            bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
           }

         if(iOTy == OP_SELL)
           {
            dSL = NormalizeDouble(dOOP + StopLoss * Point, Digits);
            dTP = NormalizeDouble(dOOP - TakeProfit * Point, Digits);

            bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
           }
        }
     }
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                                      Функция обработки ошибок |
//+-----------------------------------------------------------------------------------------------+
void vError(int iErr)
  {
   switch(iErr)
     {
      case 129:   // Неправильная цена
      case 135:   // Цена изменилась
      case 136:   // Нет цен
      case 138:   // Новые цены
         Sleep(1000);
         RefreshRates();
         break;

      case 137:   // Брокер занят
      case 146:   // Подсистема торговли занята
         Sleep(3000);
         RefreshRates();
         break;
     }
  }
//+-----------------------------------------------------------------------------------------------+
double LOT()
{
   int n=0;
   int m=0;
   int v=0;
   double OL=Lot;
   for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
            if (OrderProfit()>0) 
            {

               if (n==0) OL=NormalizeDouble(OrderLots()+K_Martin1,DigitsLot);
               n++;
               
               if ((OL>=MaxMartinLot)&& (m==0)) OL=NormalizeDouble(OrderLots()*K_Martin2,DigitsLot);
               m++;
               
               if ((OL>=MaxMartinLot2) && (v==0)) OL=NormalizeDouble(OrderLots()*K_Martin3,DigitsLot);
               v++;
            }
            else
            {
               if (n==0) {return(Lot);}
               else {return(OL);}
            }
         }
      }
   }
   
   return(OL);
}
 
законопослушный гражданин #:

Necesito que el EA no pueda abrir una nueva orden en la misma vela.

void OnTick()
  {
  datetime cTime;
  static datetime time = 0;

  cTime = iTime(NULL, PERIOD_CURRENT, 0);

  if (time != cTime)
    time = cTime;
  else
    return;

// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
   }
Razón de la queja: