Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 72

 
Vitalie Postolache:


Diré lo mismo. No se te da bien la lógica. ¿Cuál es el problema para calcular inmediatamente el lote inicial, basándose en los fondos disponibles y el valor del riesgo (creo que se escribió sobre el 3%)? ¿Por qué hay que hacer todo en un solo lugar?

Tome el valor del margen libre, multiplíquelo por el riesgo, divídalo por 100 y el valor del margen para 1 lote - aquí está la fórmula más simple para calcular el lote con un porcentaje determinado del margen libre. Además, hay que tener en cuenta el paso del cambio de lote y evitar que se supere el tamaño de lote mínimo/máximo, permitido por la empresa de corretaje:


Te comento que el EA opera en un corto periodo de tiempo en el que hay una probabilidad de que se abran 9 órdenes opuestas consecutivas que se solapan entre sí y cada orden siguiente se multiplica por 2, por lo que el margen puede no aguantar y la última orden pendiente puede no abrirse, y por tanto hay que calcular a partir del último lote máximo posible. He calculado que el mejor número de órdenes en un intervalo de 5-10 minutos es 9. En general necesito calcular un margen en caso de que todas las órdenes se abran y en base a estos datos en orden inverso calcular el primer lote.

 
if(OrdersTotal() >= OrderCount)
{
volver;
}
//----
if(r > 50 && p > m) //abrir orden de compra
{
ticketB = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,",111,0,Green); //abrir orden de compra
}
//-----
if(r < 50 && p < m) //abre las condiciones de la orden de venta
{
ticketS = OrderSend(Symbol(),OP_SELL,0.1,Bid,5,0,0,",111,0,Blue);
}
//----- cerrar órdenes
for (int i=1; i<=TotalPedidos(); i++)
{
if(OrderSelect(ticketB,SELECT_BY_TICKET)==true)
{
if(r < 50 && p < m)
{
OrderClose(ticketB,0.1,Bid,5,Red);
}
}

}

¿Dónde lo he escrito mal? Creo que lo he cogido de un ejemplo, ¿podríais decirme cómo se escribe correctamente para que el pedido se cierre

en condiciones de compra inversa? Me estoy devanando los sesos.

 
funnyrain8:
if(OrdersTotal() >= OrderCount)
{
volver;
}
//----
if(r > 50 && p > m) //abrir orden de compra
{
ticketB = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,",111,0,Green); //abrir orden de compra
}
//-----
if(r < 50 && p < m) //abre las condiciones de la orden de venta
{
ticketS = OrderSend(Symbol(),OP_SELL,0.1,Bid,5,0,0,",111,0,Blue);
}
//----- cerrar órdenes
for (int i=1; i<=TotalPedidos(); i++)
{
if(OrderSelect(ticketB,SELECT_BY_TICKET)==true)
{
if(r < 50 && p < m)
{
OrderClose(ticketB,0.1,Bid,5,Red);
}
}

}

¿Dónde lo he escrito mal? Creo que lo he cogido de un ejemplo, ¿podríais decirme cómo se escribe correctamente para que se cierre el pedido?

en condiciones de compra inversa? Me estoy devanando los sesos.


 if(OrdersTotal()>=OrderCount)  //Обрати внимание на эту конструкцию
     {                            //
      return;
     }
//---- 
   if(r>50 && p>m) //условия открытия ордера на покупку
     {
      for(int i=1; i<=OrdersTotal(); i++)
        {
         if(OrderSelect(ticketB,SELECT_BY_TICKET)==true)
           {
            if(OrderType()==OP_SELL)
              {
               OrderClose(OrderTicket(),0.1,Ask,5,Red);
              }
           }
        }
      ticketB=OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,"",111,0,Green); //открыnие ордера на покупку     

     }

//-----     
   if(r<50 && p<m) //условия открытия ордера на продажу
     {
     for(int i=1; i<=OrdersTotal(); i++)
        {
         if(OrderSelect(ticketB,SELECT_BY_TICKET)==true)
           {
            if(OrderType()==OP_BUY)
              {
               OrderClose(OrderTicket(),0.1,Bid,5,Red);
              }
           }
        }
      ticketS=OrderSend(Symbol(),OP_SELL,0.1,Bid,5,0,0,"",111,0,Blue);
     }

Así
 
funnyrain8:
if(OrdersTotal() >= OrderCount)
{
volver;
}
//----
if(r > 50 && p > m) //abrir orden de compra
{
ticketB = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,",111,0,Green); //abrir orden de compra
}
//-----
if(r < 50 && p < m) //abre las condiciones de la orden de venta
{
ticketS = OrderSend(Symbol(),OP_SELL,0.1,Bid,5,0,0,",111,0,Blue);
}
//----- cerrar órdenes
for (int i=1; i<=TotalPedidos(); i++)
{
if(OrderSelect(ticketB,SELECT_BY_TICKET)==true)
{
if(r < 50 && p < m)
{
OrderClose(ticketB,0.1,Bid,5,Red);
}
}

}

¿Dónde lo he escrito mal? Creo que lo he cogido de un ejemplo, ¿podríais decirme cómo se escribe correctamente para que el pedido se cierre

en condiciones de compra inversa? Me estoy devanando los sesos.


Si el pedido está seleccionado en el ticket, no necesita una acción en el bucle. Si quierescorregir el código, utiliza el botón SRC parapegar el código en el mensaje.
 
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict    
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int ticketB,ticketS;
void OnTick()
//------------------------------------------------------------------------------------------------
{
double p = iClose("EURUSD",PERIOD_M15,0);                                    //показание текущей цены 
double r = iRSI  ("EURUSD",PERIOD_M15,21,PRICE_CLOSE,0);                     //значение индюка RSI
double m = iMA   ("EURUSD",PERIOD_M15,89,0,MODE_EMA,PRICE_CLOSE,0);          //значение индюка МА
int    OrderCount  = 1;

//---------------ПОДСЧЕТ ОРДЕРОВ------------------------------------------------------------------
if(OrdersTotal() >= OrderCount)
          {
             return;
          }   
//-------------ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ--------------------------------------------------------------------
/*if(r > 50 && p > m)                                                        //условия открытия ордера на покупку
    {   
        ticketB = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,"",111,0,Green);         
    }
//------------ЗАКРЫТИЕ ОРДЕРА НА ПРОДАЖУ--------------------------------------------------------
if(r<50 && p<m)                                                           
     {
      for(int i=1; i<=OrdersTotal(); i++)
        {
         if(OrderSelect(ticketB,SELECT_BY_TICKET)==true)
           {
            if(OrderType()==OP_BUY)
              {
                  ticketB = OrderClose(OrderTicket(),0.1,Bid,5,Red);
              }
           }
        }
     }*/
//------------------ОТКРЫТИЕ ОРДЕРА НА ПРОДАЖУ---------------------------------------------------------
if(r < 50 && p < m)                                                        //условия открытия ордера на продажу
    {
        ticketS = OrderSend(Symbol(),OP_SELL,0.1,Bid,5,0,0,"",111,0,Blue); 
    } 
//---------------------ЗАКРЫТИЕ ОРДЕРА НА ПРОДАЖУ---------------------------------------------------------
if(r>50 && p>m) 
     {
   for(int i=1; i<=OrdersTotal(); i++)
        {
         if(OrderSelect(ticketS,SELECT_BY_TICKET)==true)
           {
            if(OrderType()==OP_SELL)
              {
                  ticketS = OrderClose(OrderTicket(),0.1,Ask,5,Red);
              }
           }
        }
     }
}
//+------------------------------------------------------------------+
Gracias por el SRC), esto es lo que parece, el ts se ve así, vender debería ocurrir cuando la vela cerró por debajo del wop y el rsi por debajo de 50, y cerrar la orden en condiciones opuestas, y simultáneamente después del cierre comprar debería ocurrir y después del cierre, entonces una orden y no más y así cíclicamente ... pero ahora tengo una orden abierta y eso es todo, y las paradas no están funcionando ...
 
funnyrain8:
Gracias por el SRC), esto es lo que parece, ts parece esto, vender debería ocurrir cuando la vela cerró por debajo de la muñeca y rsi por debajo de 50, y cerrar la orden en las condiciones opuestas, y al mismo tiempo después del cierre debería ocurrir comprar y después del cierre, entonces una orden y no más y así cíclicamente ... pero ahora abro una orden y todo, y las paradas no funcionan ...


Lo he reescrito a mi estilo, espero que lo entiendas, si algo no está claro, no dudes en preguntar

//+------------------------------------------------------------------+
//|                                                   funnyrain8.mq4 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
#property strict

input int             MagicNumber  = 20110315;       // Номер копии
input string          CommentOrder = "Origenal";     // Комментарий к ордеру
input int             Slippage=100;             // Проскальзование (Пипс)
input double          Lot=0.01;           // Объем лота 
input int             SignalBar=0; // Сигнальный бар 

sinput string            s1=NULL; // Setting indicator slow МА
input int                ma_period=89;    // Period
input ENUM_MA_METHOD     ma_method=MODE_EMA;//Method calculation
input ENUM_APPLIED_PRICE ma_price=PRICE_CLOSE;//Price calculation

sinput string            s2=NULL; // Setting indicator RSI
input int                rsi_period=21; // Period
input ENUM_APPLIED_PRICE rsi_price=PRICE_CLOSE;//Price calculation
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(TotalOrder()==0)OrderOpen(GetSignal());
   else OrderClose(GetSignal());
  }
//+------------------------------------------------------------------+
int GetSignal()
  {
   double rsi = iRSI(_Symbol,PERIOD_CURRENT,rsi_period,rsi_price,SignalBar);                     //значение индюка RSI
   double ma = iMA   (_Symbol,PERIOD_CURRENT,ma_period,0,ma_method,ma_price,SignalBar);          //значение индюка МА

   if(Close[SignalBar]>ma && rsi>50.0)return(OP_BUY);
   if(Close[SignalBar]<ma && rsi<50.0)return(OP_SELL);
   return(WRONG_VALUE);
  }
//+------------------------------------------------------------------+
int TotalOrder()
  {
   int value=0;
   int total=OrdersTotal();
   for(int i=total-1; i>=0; i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderMagicNumber()!=MagicNumber)continue;
      if(OrderType()>1)continue;
      value++;
     }
   return(value);
  }
//+------------------------------------------------------------------+
void OrderOpen(int type)
  {
   if(type==WRONG_VALUE)return;
   double price_open=(type==OP_BUY)?NormalizeDouble(Ask,_Digits):NormalizeDouble(Bid,_Digits);
   int ticket=OrderSend(_Symbol,type,Lot,price_open,Slippage,0,0,CommentOrder,MagicNumber);
   if(ticket<0)Print("Ошибка открытия ордера № - ",GetLastError());
  }
//+------------------------------------------------------------------+
void OrderClose(int type)
  {
   if(type==WRONG_VALUE)return;
   int total=OrdersTotal();
   for(int i=total-1; i>=0; i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderMagicNumber()!=MagicNumber)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderType()!=type)continue;
      double price_close=(type==OP_BUY)?NormalizeDouble(Bid,_Digits):NormalizeDouble(Ask,_Digits);
      bool res=OrderClose(OrderTicket(),OrderLots(),price_close,Slippage);
      if(!res)Print("Ошибка закрытия ордера № - ",GetLastError());
     }
  }
//+------------------------------------------------------------------+

...

 
Sergey Gritsay:


reescrito en mi propio estilo, espero que entiendas, si no entiendes algo pregunta

...


oh, pensé que había escrito casi todo excepto el cierre y todavía tengo mucho que aprender...muchas gracias ahora por lo menos tengo un ejemplo para seguir...tin, gracias de nuevo)
 
Hola. He descargado el software Metatrader 5. Me he apuntado a 2 señales. El saldo de mi cuenta es positivo en 20$. Estoy intentando instalar un alojamiento virtual y no funciona nada. Presiono el navegador, me conecto a la cuenta de comercio, incluso no tengo esa pestaña en la tabla de alojamiento virtual. Le envío capturas de pantalla. ¿Cómo me conecto al alojamiento compartido?
Archivos adjuntos:
3p46y0.jpg  273 kb
g4ppe22.jpg  264 kb
 
Жанна Платонова:
Hola. He descargado el software Metatrader 5. Me he apuntado a 2 señales. El saldo de mi cuenta es positivo en 20$. Estoy intentando instalar un alojamiento virtual y no funciona nada. Presiono el navegador, me conecto a la cuenta de comercio, incluso no tengo esa pestaña en la tabla de alojamiento virtual. Le envío capturas de pantalla. ¿Cómo me conecto al alojamiento compartido?

Haga clic en la ayuda del menú principal.
 
Hola. Tengo una pregunta - en el mac (sierra) en todos los entregados (a través de vino) de diferentes empresas plataformas mt4 el mismo fallo - el terminal si se libera de su lugar normal en la parte inferior para moverlo como una ventana libre - se encoge y trabajar a través de él es completamente imposible. Desactivar el auto-ordenador no funciona. Para devolver el terminal en el primer lugar absolutamente imposible - es decir, simplemente no se adjunta y no se abre más. Tengo una pregunta: ¿alguien puede conocer un atajo o botón para devolver toda la interfaz a su lugar original? Sinceramente.