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

 
SanAlex #:

en su código - aquí es donde se recogen los números

en el indicador de señal - que tiene una alerta . aquí para tener más señales - eliminar un par de líneas


Gracias.
 

¡Hola!

Decidí hacer búhos un poco más complicados.

Quiero hacer algo como el arrastre, pero con una acción simple / doble

idea:

el precio pasó el 75% a la toma - el stop disminuyó (por ejemplo) en 20 pips y la toma aumentó en 20 pips.

el precio pasó el 90% a la toma - la parada disminuyó (por ejemplo) en 30p y la toma aumentó en 10p.

Veo el esquema así (.....function...)=> (TP - Mparametr)

donde: TP - TakeProfit

Mparametr- conjunto en variables externas del EA (por ejemplo, el número de puntos)

¿Qué funciones deben utilizarse para resolver este problema?

He leído sobre las variables predefinidas bid,ask - ¿debemos usarlas como base?

¿o debemos utilizar MarketInfo o SymbolInfoTick?

Tengo una solución similar, pero su turno de parada y toma depende de los lotes:

  if((iOTy == OP_BUY)&& (LOT()>LotControl))
             {
              dSL = NormalizeDouble(dOOP - StopLoss * Point+DownLoss * Point, Digits);
              dTP = NormalizeDouble(dOOP + TakeProfit * Point+DownProfit * Point, Digits);

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

Quiero hacer algo similar, relativamente sencillo.


MarketInfo - Получение рыночной информации - Справочник MQL4
MarketInfo - Получение рыночной информации - Справочник MQL4
  • docs.mql4.com
MarketInfo - Получение рыночной информации - Справочник MQL4
 
Tretyakov Rostyslav #:

O así

Llevo casi una semana escribiendo esta tabla y el problema es el siguiente: si además configuro el nivelador pendiente para que se cierre en el botón por analogía con la aproximación, que fue un punto por debajo cuando se alcanzó el precio, entonces por alguna razón se cierra automáticamente sin preguntar, sin pulsar el botón, que debería hacerlo un punto por encima (después de pulsar y tras alcanzar un nivel como en teoría debería)


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
  

  
  
  
//--- 
     ObjectCreate(0,"Button_1",OBJ_BUTTON,0,0,0);
   ObjectSetInteger(0,"Button_1",OBJPROP_XDISTANCE,20);
   ObjectSetInteger(0,"Button_1",OBJPROP_YDISTANCE,120);
   ObjectSetInteger(0,"Button_1",OBJPROP_XSIZE,100);
   ObjectSetInteger(0,"Button_1",OBJPROP_YSIZE,20);
   ObjectCreate(0,"Label_1",OBJ_LABEL,0,0,0);
   ObjectSetInteger(0,"Label_1",OBJPROP_XDISTANCE,20);
   ObjectSetInteger(0,"Label_1",OBJPROP_YDISTANCE,40);
   ObjectSetInteger(0,"Label_1",OBJPROP_CORNER,CORNER_LEFT_UPPER);
   ObjectSetString(0,"Label_1",OBJPROP_TEXT,"Price");
   ObjectSetInteger(0,"Label_1",OBJPROP_COLOR,clrBlack);
   
   
   //--- CLOSE BUY +1
   ObjectCreate(0,"Button_21",OBJ_BUTTON,0,0,0);
   ObjectSetInteger(0,"Button_21",OBJPROP_XDISTANCE,240);
   ObjectSetInteger(0,"Button_21",OBJPROP_YDISTANCE,120);
   ObjectSetInteger(0,"Button_21",OBJPROP_XSIZE,100);
   ObjectSetInteger(0,"Button_21",OBJPROP_YSIZE,20);
   ObjectSetString(0,"Button_21",OBJPROP_TEXT,"CLOSE BUY +1");
   ObjectSetInteger(0,"Button_21",OBJPROP_BGCOLOR,Beige);
   ObjectSetInteger(0,"Button_21",OBJPROP_COLOR,Green);
   ObjectCreate(0,"Label_21",OBJ_LABEL,0,0,0);
   ObjectSetInteger(0,"Label_21",OBJPROP_XDISTANCE,20);
   ObjectSetInteger(0,"Label_21",OBJPROP_YDISTANCE,40);
   ObjectSetInteger(0,"Label_21",OBJPROP_CORNER,CORNER_LEFT_UPPER);
   ObjectSetInteger(0,"Label_21",OBJPROP_COLOR,clrBlack);
//---
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   if(sparam=="Button_1")
     {
      ObjectSetString(0,"Label_1",OBJPROP_TEXT,DoubleToString(Ask-1*_Point,Digits));
      Comment("цена на момент нажатия кнопки: "+Ask, " ждем цены для входа: "+(Ask-1*_Point));
     }
     
        if(sparam=="Button_21")
     {

      ObjectSetString(0,"Label_21",OBJPROP_TEXT,DoubleToString(Bid+1*_Point,Digits));
      ObjectSetText("MSG","цена Bid в момент нажатия кнопки: "+ DoubleToString(Bid,Digits),8,"Verdana", White);
      ObjectSetText("MSG2","ждем цены Bid для закрытия: "+ DoubleToString(Bid+1*_Point,Digits),8,"Verdana", White);

     }
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int ticket;
   double price=StringToDouble(ObjectGetString(0,"Label_1",OBJPROP_TEXT));
   if(Ask<=price)
     {
      ticket = OrderSend(_Symbol,OP_BUY,0.01,Ask,0,0,0,NULL,0,0,clrGreen);
      ObjectSetString(0,"Label_1",OBJPROP_TEXT,DoubleToString(DBL_MAX,Digits));
      ObjectSetInteger(0,"Button_1",OBJPROP_STATE,false);
      Comment("цена ожидания была: "+price, " зашли по: "+Ask, " TakeProfit на: "+(Ask+4*_Point));
     }
     
     
     
       //-----close buy +1

   double priceclosebuyplus1=StringToDouble(ObjectGetString(0,"Label_21",OBJPROP_TEXT));
   if(Bid>=priceclosebuyplus1)
     {

      
      ObjectSetString(0,"Label_21",OBJPROP_TEXT,DoubleToString(DBL_MAX,Digits));
      ObjectSetInteger(0,"Button_21",OBJPROP_STATE,false);
      ObjectSetText("MSG","ожидали цену закрытия Bid: "+DoubleToString(priceclosebuyplus1,Digits),8,"Verdana", White);
      ObjectSetText("MSG2","закрыли по цене Bid: "+ DoubleToString(Bid,Digits),8,"Verdana", White);
      CloseBuyPositions1();
     }
     
     
     
  }
  
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseBuyPositions1()
  {

   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))



         if(OrderType()==OP_BUY)
           {
            if(OrderClose(OrderTicket(), OrderLots(), Bid, 3, NULL))
              {
               Print("Order Close");
              }
           }

  }

ayúdame

 
Порт-моне тв #:

En fin, llevo casi una semana escribiendo este cuadro y aquí está el problema, si además pongo el nivel más pendiente a algún tipo de cierre en el botón análogo en la aproximación, que era un punto por debajo cuando se alcanza el precio, por alguna razón sin pedirlo se cierra automáticamente de inmediato, sin pulsar el botón, que debería hacerlo un punto por encima (después de pulsar y al llegar a un nivel como en teoría se necesita)


ayúdame


if(Bid>=priceclosebuyplus1&&priceclosebuyplus1>0)
 
законопослушный гражданин #:

¡Hola!

Decidí hacer búhos un poco más complicados.

Quiero hacer algo como el arrastre, pero con una acción simple / doble

idea:

el precio pasó el 75% a la toma - el stop disminuyó (por ejemplo) en 20 pips y la toma aumentó en 20 pips.

el precio pasó el 90% a la toma - la parada disminuyó (por ejemplo) en 30 pips y la toma aumentó en 10 pips.


int TakeProfit=200;
int StopLoss  =100;
//+----------------------------------------------------------------------------+
void TrailingOrders()
  {
   for(int i = OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
           {
            if(OrderType() == OP_BUY)
              {
               if(Bid >= OrderOpenPrice()+(TakeProfit*0.75*_Point) && OrderStopLoss()<OrderOpenPrice()-20*_Point)
                 {
                  if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss()+20*_Point, OrderTakeProfit()+20*_Point, 0))
                     Print("Модификации ордера на покупку успешна!");
                  else
                     Print("Ошибка модификации ордера на покупку! - ",GetLastError());
                 }
               if(Bid >= OrderOpenPrice()+(TakeProfit*0.9*_Point) && OrderStopLoss()>=OrderOpenPrice()-20*_Point)
                 {
                  if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss()+30*_Point, OrderTakeProfit()+10*_Point, 0))
                     Print("Модификации ордера на покупку успешна!");
                  else
                     Print("Ошибка модификации ордера на покупку! - ",GetLastError());
                 }
              }
           }
        }
     }
  }
 
Tretyakov Rostyslav #:

Gracias. Es interesante. ¡Intentaré averiguarlo!

resulta quesi(Bid es el parámetro de precio actual -que no se llama de ninguna manera- se pueden comparar ciertos valores con él?

¿y la unidad de laoferta es el tic? (no se expresa en dinero)

 
Tretyakov Rostyslav #:


Sólo me preocupa una pequeña cosa: todas las órdenes se cierran de vez en cuando (es decir, todas y siempre), pero a veces, si abro 3-4 órdenes, sólo 2 o 1 de ellas pueden cerrarse. Creo que hay un i-check especial para esto, tal vez pueda dar una pista.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseBuyPositions1()
  {

   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))



         if(OrderType()==OP_BUY)
           {
            if(OrderClose(OrderTicket(), OrderLots(), Bid, 0, NULL))
              {
               Print("Order Close");
              }
           }

  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseSellPositions2()
  {

   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))



         if(OrderType()==OP_SELL)
           {
            if(OrderClose(OrderTicket(), OrderLots(), Ask, 0, NULL))
              {
               Print("Order Close");
              }
           }

  }
//+------------------------------------------------------------------+
 
законопослушный гражданин #:

Gracias. Es interesante. ¡Intentaré averiguarlo!

resulta quesi(Bid es el parámetro de precio actual -que no se llama de ninguna manera- se pueden comparar ciertos valores con él?

¿y la unidad de laoferta es el tic? (no se expresa en dinero)

Laoferta es precio actual Así que compara con el precio de apertura +/- condición

En cuanto a los ticks, ni el Bid ni el Ask se miden en ticks. Los ticks son la llegada de un nuevo precio.

 
Tretyakov Rostyslav #:

Laoferta es precio actual por lo que tenemos que compararlo con el precio de apertura +/- condición

En cuanto a los ticks, ni el Bid ni el Ask se miden en ticks. Los ticks son la llegada de un nuevo precio.

Ya veo. Entonces, ¿en qué se mide? ¿pips/puntas?

 
законопослушный гражданин #:

Ya veo. ¿Cómo se mide entonces? ¿En puntos/pips?

MarketInfo(_Symbol,MODE_TICKSIZE);
Razón de la queja: