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

 
Ihor Herasko:

Este método de cálculo del swap se denomina rollover. No se puede saber de forma programada en MT4. Sólo indirectamente después del cambio de medianoche de las órdenes de mercado de trabajo. Hay muchos de estos pequeños, pero bastante desagradables problemas en MT4. En MT5 hay un poco menos, pero siguen existiendo.

Estos son los valores del swap en pips. Deben convertirse a la moneda del depósito, en función del volumen de la orden de mercado. Entonces obtendrá el tamaño real del intercambio.

"No hay forma de averiguarlo programáticamente en MT4". - Gracias por su tiempo y sus respuestas.

 

Buenas tardes! Estimados usuarios del foro, por favor ayúdenme a entender el algoritmo. El objetivo es determinar el rango de precios en el período de tiempo especificado y establecer las paradas de compra y venta en el máximo y el mínimo. Los Stoploss se establecen en órdenes opuestas, TakeProfit debe ser igual a StopLoss*2.

Luego, después de cada cierre por Stop Loss, la orden se restablece con el mismo Stop Loss y Take Profit que la cerrada y todo el ciclo se completa una vez que una de las órdenes se cierra por Take Profit. Y todo desde el principio definimos la gama y vamos.

Pero ahora simplemente no coloca TP o más bien lo coloca en el precio de apertura y el stop loss no está en el tamaño del rango, es decir, no en una orden dirigida en sentido contrario. Le agradezco de antemano su ayuda.

static int prevtime = 0;
int MagicNumber = 12345678;
input int stoploss = 40;
input int takeprofit = 50;
input int padding = 5;
int a=1;
input string startTime = "14:35";
input string endTime = "18:35";
int expertBars;
double max, min;
bool isEndTime = true;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   //sendOrders();
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
#include <expert.mq4>
 
int start()
{  
    //Возвращает максимум и минимум за промежуток
    if(isTime()) getMaxMin();
    
    // всё, что задается ниже - будет работать по "ценам открытия"
    //нового бара, т.е. будет срабатывать в момент его появления
    //на том графике, на кот. стоит советник
    CheckEvents( MagicNumber );
    if ( eventBuyClosed_SL > 0 ) {
        Alert( _Symbol, OrderClosePrice(), ": Buy-позиция закрыта по СтопЛоссу!" );
        double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
        Alert("Минимальный стоп левел: ", minstoplevel);
        OrderSend(_Symbol,OP_BUYSTOP,OrderLots(),OrderOpenPrice(),3,OrderStopLoss(),OrderTakeProfit(),"My order",MagicNumber,0,clrGreen);
    }
    
    if ( eventBuyClosed_TP > 0 ) {
        Alert( _Symbol, OrderClosePrice(), ": Buy-позиция закрыта по ТейкПрофиту!" );
        deleteAllPaddingOrders();
    }
    
    if ( eventSellClosed_SL > 0 ) {
        Alert( _Symbol, OrderClosePrice(), ": Sell-позиция закрыта по СтопЛоссу!" );
        double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
        Alert("Минимальный стоп левел: ", minstoplevel);
        OrderSend(_Symbol,OP_SELLSTOP,OrderLots(),OrderOpenPrice(),3,OrderStopLoss(),OrderTakeProfit(),"My order",MagicNumber,0,clrRed);
    }
    
    if ( eventSellClosed_TP > 0 ) {
        Alert( _Symbol, OrderClosePrice(), ": Sell-позиция закрыта по ТейкПрофиту!" );
        deleteAllPaddingOrders();
    }
    
    if ( eventBuyLimitOpened > 0 || eventBuyStopOpened > 0 || 
          eventSellLimitOpened > 0 || eventSellStopOpened > 0 )
        Alert( _Symbol, OrderType(), ": сработал отложенный ордер!" );
return(0);
}
//-----------------------------------------------------------------+
void deleteAllPaddingOrders() {
  int total = OrdersTotal();
  for(int i=total-1;i>=0;i--)
  {
    OrderSelect(i, SELECT_BY_POS);
    int type   = OrderType();
    if (OrderMagicNumber() != MagicNumber) continue;
    if (OrderSymbol() != _Symbol) continue;
    bool result = false;
    
    switch(type)
    {
      //Close opened long positions
      case OP_BUY       : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
                          break;
      
      //Close opened short positions
      case OP_SELL      : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );
      //                    break;

      //Close pending orders
      //case OP_BUYLIMIT  :
      //case OP_SELLLIMIT :
      case OP_BUYSTOP   :
      case OP_SELLSTOP  : result = OrderDelete( OrderTicket() );
    }
    
    if(result == false)
    {
      Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
      Sleep(3000);
    }
    return;
  }
  
  return;
}
void sendOrders(bool isFirst) {
   //--- получим минимальное значение Stop level
   double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
   Print("Minimum Stop Level=",minstoplevel," points");
   //--- BUYSTOP
   //--- вычисленные значения цен SL и TP должны быть нормализованы
   //--- размещаем рыночный ордер на покупку 1 лота
   int ticketBuyStop, ticketSellStop;
   if(!isFirst) {
      ticketBuyStop=OrderSend(Symbol(),OP_BUYSTOP,1,Ask + padding * Point,20,Bid -padding*Point,Ask + padding * Point,"My order",MagicNumber,0,clrGreen);
      ticketSellStop=OrderSend(Symbol(),OP_SELLSTOP,1,Bid - padding * Point,20,Ask + padding*Point,Bid - padding * Point,"My order",MagicNumber,0,clrRed);
   } else { 
      ticketBuyStop=OrderSend(Symbol(),OP_BUYSTOP,1,max + padding * Point,20,min -padding*Point,max + (max - min + padding) * Point,"My order",MagicNumber,0,clrGreen);
      ticketSellStop=OrderSend(Symbol(),OP_SELLSTOP,1,min - padding * Point,20,max + padding*Point,min - (max - min  + padding)*Point,"My order",MagicNumber,0,clrRed);
   }
   if(ticketBuyStop<0)
     {
     Print("OrderSend завершилась с ошибкой #",GetLastError());
      
         deleteAllPaddingOrders();
         if(a <=5) {
         //sendOrders(isFirst);
         a= a+1;
      }
     }
   else
      Print("Функция OrderSend успешно выполнена");
   //---BUYSTOP
   
   //---SELLSTOP
   //--- вычисленные значения цен SL и TP должны быть нормализованы
   //--- размещаем рыночный ордер на покупку 1 лота
   
   if(ticketSellStop<0)
     {
      
         deleteAllPaddingOrders();
         if(a <= 5) {
            //sendOrders();
            a= a+1;
            Print("a", a);
         }
         Print("OrderSend завершилась с ошибкой #",GetLastError());
       
     }
   else
      Print("Функция OrderSend успешно выполнена");
   //---SELLSTOP
   return;
}
bool getMaxMin() {
   int startIndex = iBarShift(_Symbol, 0, StrToTime(startTime), true);
   min=iLow(NULL,0,iLowest(NULL,0,MODE_LOW,startIndex,0));
   max=iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,startIndex,0));
   Alert("Min: ", min);
   Alert("Max: ", max);
   sendOrders(true);
   return true;
}

//===============================================================================+
//======| возвращает true если временной диапозон кончился                       |
//===============================================================================+
bool isTime() {
   if (TimeHour(StrToTime(startTime)) == Hour() && TimeMinute(StrToTime(startTime)) == Minute() && isEndTime) { Alert("Start Timeline"); isEndTime = false; deleteAllPaddingOrders();};
   if(TimeHour(StrToTime(endTime)) == Hour() && TimeMinute(StrToTime(endTime)) <= Minute() && !isEndTime) { Alert("End Timeline"); isEndTime = true; return true;};
   return false;
}

//=====================================================================+
//======| возвращает true если появился новый бар, иначе false |
//=====================================================================+
//bool isNewBar()
//{
//bool res=false;
//if(expertBars!=iBars(Symbol(),0))
//{
//expertBars=iBars( Symbol (),0);
//res=true;
//}
//return(res);
//}
 
Sobbaka:

No es necesario duplicar las preguntas en diferentes hilos.

 

¡Buenas tardes!

Al probar en el registro me sale el error OrderSend 130 - si entiendo bien sólo puede estar relacionado con los topes o golpes, por favor, compruebe lo que está mal:

#define  MagicNumber1 100            //Buy
input double MaximumRisk=0.03;      //Max риск в сделке
 input double K=1;                   //Коэффициент риск к прибыли
input int OrderPoint=30;            //Расстояние до отложенного ордера
double Price=0;                     //Цена для установки отложенного ордера
double SL=0;                        //Stop Loss
double TP=0;                        //Take Profit
double Lots=0;                      //Просчет лотности исходя из max риска одной сделки


void OnTick()
{
//Параметры для открытия ордера                   
Price = NormalizeDouble(High[1]+OrderPoint*Point,Digits); //Цена открытия ордера
SL = NormalizeDouble(Low[1]-Point,Digits); //Стоп лосс
if ((Price-SL)<NormalizeDouble(MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits))
{SL=Price-NormalizeDouble(MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);}
TP = NormalizeDouble((Price-SL)*K+Price,Digits); //Тэйк профит
//Просчет лотности исходя из риска в сделке
Lots = NormalizeDouble(((AccountBalance()*MaximumRisk/100.0)/((Price-SL)*1000.0)),1);

//Установка отложенного ордера
bool send1=OrderSend(Symbol(),OP_BUYSTOP,Lots,Price,3,SL,TP,"comment",MagicNumber1,0,clrGreen);
}
 
YanSay:

¡Buenas tardes!

Al probar en el registro hay un error OrderSend error 130 - si entiendo correctamente sólo puede estar relacionado con paradas o golpes,

Los precios abiertos de las órdenes pendientes también se ven afectados. Por eso hay que comprobar la distancia entre el precio actual del mercado y el precio de apertura de la orden. En este caso: Precio - Pregunta.

 
Ihor Herasko:

También se aplica el precio de apertura de las órdenes pendientes. Por lo tanto, también debemos comprobar la distancia entre el precio actual del mercado y el precio de apertura de la orden. En este caso: Precio - Pregunta.

Gracias.
 
Artyom Trishkin:
¿Qué devuelve la función Hour()?

Devuelve la hora actual. Así es como trabajo: si la hora actual es mayor que 11 y menor que 17,

if(Hour()>=17&&Hour()<=11)continue;

¿pero cómo?

 
Tigerfreerun:

Es un poco complicado para mí. ¿Podría explicar en qué parte del código para agregar y qué significa mn y mag_n? ¿dónde debo poner mi EA medjic aquí?

Antes de que su estado ponga

if(Hour()>=0&&Hour()<=8&&!OP_TO(mag_n))step = 5; else step =10;

mag_n - ¿dónde pongo el IG de mi EA aquí?

 
PolarSeaman:

Escribo: si la hora actual es más de las 11 y menos de las 17, ¿cómo debería ser?

Entiendo que la pregunta es sobre el indicador. En lugar deHour() -> time[i]

 
Vitaly Muzichenko:

Entiendo que la pregunta es sobre el indicador. En lugar deHour() -> time[i].

Sí, me has ayudado, ahora quiero limitar el tiempo. Excluye el cómputo de las 17 a las 23 horas.

  for(int i=limit-2; i>0; i--) 
     {
     if(Hour()>=17&&Hour()<=11)continue;
      if(i%2==0) 
        {
         if(open[i]<close[i] && open[i+1]>close[i+1]) 
           {
            k1++;
           // if(k1>max) {max=k1; dat_max=time[i];}
            if(k1>=4)Print("Num: ",k1,"dat_max ",time[i]);
            SetText("Obj_"+(string)time[i],(string)k1,time[i],high[i],Arr);
           }
         else k1=0;
         
           } else {
         if(open[i]<close[i] && open[i+1]>close[i+1]) 
           {
            k2++;
            //if(k2>max){ max=k2; dat_max=time[i];}
            if(k2>=4)Print("Num: ",k2,"dat_max ",time[i]);
            SetText("Obj_"+(string)time[i],(string)k2,time[i],high[i],Arr);
           }
         else k2=0;
         
        }
      
     }