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

 
Galim_V:

La tarea consiste en encontrar la barra con el mínimo cierre

for(int x=0; x<=xBars -1; x++)

{

contra++;

// Print(Close[x],",",counter);

int h = ArrayMinimum(Close[x]);

if(contador > 20) break;

}

El compilador jura en Close

Escriba los precios de cierre en una matriz separada y luego fuera del pollito ArrauMinimum
 
Alekseu Fedotov:
Escriba los precios de cierre en una matriz separada y luego fuera del pollito ArrauMinimum
Gracias.
 
Galim_V:

La tarea consiste en encontrar la barra con el cierre mínimo

hay funciones iHighest y iLowest (ahora también en MT5)

 
Taras Slobodyanik:

hay funciones iHighest y iLowest (ahora también en MT5)

Gracias.
 
Galim_V:

La tarea consiste en encontrar la barra con el mínimo cierre

for(int x=0; x<=xBars -1; x++)

{

contra++;

// Print(Close[x],",",counter);

int h = ArrayMinimum(Close[x]);

if(contador > 20) break;

}

El compilador jura en Close

La tarea de buscar el precio mínimo/máximo en MQL4 se resuelve con una línea:

double fMinClose = iClose(NULL, 0, iLowest(NULL, 0, MODE_CLOSE, <сколько баров>, <начинать с бара>));
 
Taras Slobodyanik:

puedes, pero no será exactamente un temporizador.

Gracias.

¿Cómo se calcula el volumen del lote en incrementos? Si el depósito =1000, el lote = 0,1, el depósito se convirtió en 2000 el lote = 0,2. Es decir, si el depósito es de 1500 o 1700, el lote no se incrementa.

 
PolarSeaman:

Gracias.

¿Cómo se calcula el volumen del lote en incrementos? Si el depósito =1000, el lote = 0,1, el depósito se convirtió en 2000 el lote = 0,2. Es decir, si el depósito es de 1500 o 1700, el lote no aumenta.

double percentLot = 0.01,
       lot = NormalizeDouble(MathFloor(AccountInfoDouble(ACCOUNT_BALANCE)*percentLot/10)/10, 1);

De alguna manera...

 
Konstantin Nikitin:

Así...

No, no, con un depósito de 1100, el lote será de 0,11, y necesito que el lote no aumente hasta 2000. ¿Cómo puedo establecer el paso =1000 en la configuración?

 
Buenas tardes, podría decirme si es posible añadir coordenadas al indexador al ratón si puede, por favor envíeme un correo electrónico a ereminmikola@yandex.ru
 

Hola programadores. ¿Podría darme una pista sobre cómo enfocar correctamente la siguiente condición?

1. El Asesor Experto abre 2 órdenes de mercado (compra y venta) con el mismo lote especificado en la configuración. - Esta orden se ejecuta sin problemas

El siguiente presenta un problema, el precio puede moverse tanto a la dirección de VENTA como a la de COMPRA. ¿Cómo podemos organizar el código para que cuando se hayan superado n puntos, el Asesor Experto escanee la rentabilidad de esas dos operaciones en VIVO y cierre la orden que tenga un saldo negativo después de n puntos? Si tienes alguna otra idea de cómo hacerlo, por favor, aconséjalo.

Te doy el código - borrador, sólo se ejecuta el primer punto, y se abren 2 operaciones con TP y SL

2. Cuando el precio alcanza la cantidad especificada de puntos, entonces cierro la orden con un saldo negativo y abro 2 órdenes más (compra y venta) con el mismo lote,

Los topes se fijan en el precio de apertura de la primera orden, es decir, si la tendencia se invierte, las 3 órdenes deberían cerrarse simultáneamente.


extern int    _ms = 1000;  
extern double _lots = 0.01;
extern double _TP = 80;
extern double _SL = 35;

int _mn;
double pt;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  { 
   pt = Point;
   if (Digits==3||Digits==5) {pt*=10;} else pt = Point;
   _mn = MagicNumberGenerator(_ms);
   Print("The magic number is ",_mn);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
    if (IsNewCandle())
    {
      if (TotalOpenOrders(_mn)==0)
      {
        EnterTrade(OP_BUY);
        EnterTrade(OP_SELL);
      }
    }   
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|   Открытие первых позиций                                        |
//+------------------------------------------------------------------+
void EnterTrade(int type)
{
   double price = 0; double sl = 0; double tp = 0; double lot = _lots;
   
   if      (type == OP_BUY)  price = Ask;
   else if (type == OP_SELL) price = Bid;
   
   int err = 0;
   int ticket = OrderSend(_Symbol, type, lot, price, 30, 0, 0, NULL, _mn, 0, clrGreen);
   if (ticket == -1)
   {
     err = GetLastError();
     Print("Could not place the order due to error ",err," ",ErrorDescription(err));
     if (err == ERR_TRADE_NOT_ALLOWED) Alert("You need to enable you autotrade button");
   }
   else 
   {
     if(!OrderSelect(ticket,SELECT_BY_TICKET))
     {
       err = GetLastError();
       Print("Could not select the order due to error ",err," ",ErrorDescription(err));
     }
     else 
     {
       if (OrderType()==OP_SELL)
       {
         sl = OrderOpenPrice()+(_SL*pt);
         if (_SL==0) sl = 0; 
         tp = OrderOpenPrice()-(_TP*pt);
       }  
       else if (OrderType()==OP_BUY)
       {
         sl = OrderOpenPrice()-(_SL*pt);
         if (_SL==0) sl = 0; 
         tp = OrderOpenPrice()+(_TP*pt);
       }
       if(!OrderModify(ticket, OrderOpenPrice(), sl, tp, 0, clrNONE))
       err = GetLastError();
       Print("Could not modify the order due to error ",err," ",ErrorDescription(err));
     }
   }
}