Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 538

 
Ihor Herasko:

Questo metodo di calcolo degli swap è chiamato rollover. Non è possibile saperlo programmaticamente in MT4. Solo indirettamente dopo il cambio di mezzanotte degli ordini del mercato del lavoro. Ci sono molti di questi piccoli, ma piuttosto spiacevoli problemi in MT4. In MT5 ce ne sono un po' meno, ma esistono ancora.

Questi sono i valori di swap in pip. Dovrebbero essere convertiti nella valuta del deposito, in base al volume dell'ordine di mercato. Poi si otterrà la dimensione reale dello swap.

"Non c'è modo di scoprirlo programmaticamente in MT4". - Grazie per il vostro tempo e le vostre risposte.

 

Buon giorno! Cari utenti del forum, per favore aiutatemi a capire l'algoritmo. L'obiettivo è quello di determinare la gamma di prezzi nel periodo di tempo specificato e impostare gli stop di acquisto e vendita sul massimo e sul minimo. Gli stoploss sono impostati su ordini opposti, TakeProfit dovrebbe essere uguale a StopLoss*2.

Poi, dopo ogni chiusura per Stop Loss, l'ordine viene ripristinato con lo stesso Stop Loss e Take Profit di quello chiuso e l'intero ciclo viene completato una volta che uno degli ordini viene chiuso per Take Profit. E tutto dall'inizio definiamo la gamma e andiamo.

Ma ora semplicemente non piazza il TP o meglio lo piazza al prezzo aperto e lo stop loss non è sulla dimensione del range, cioè non su un ordine diretto in modo opposto. Grazie in anticipo per l'aiuto.

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:

Non c'è bisogno di duplicare le domande in diversi thread.

 

Buon pomeriggio!

Quando provo nel log ottengo l'errore OrderSend 130 - se ho capito bene può essere legato solo agli stop o ai colpi, per favore controlla cosa c'è di sbagliato:

#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:

Buon pomeriggio!

Quando si prova nel log c'è un errore OrderSend error 130 - se ho capito bene può essere solo legato a fermate o corse,

Anche i prezzi aperti degli ordini in sospeso sono influenzati. Ecco perché dobbiamo controllare la distanza tra il prezzo corrente di mercato e il prezzo aperto dell'ordine. In questo caso: Prezzo - Chiedi.

 
Ihor Herasko:

Si applica anche il prezzo di apertura degli ordini in sospeso. Quindi dovremmo anche controllare la distanza tra il prezzo corrente di mercato e il prezzo di apertura dell'ordine. In questo caso: Prezzo - Chiedi.

Grazie!
 
Artyom Trishkin:
Cosa restituisce la funzione Hour()?

Restituisce l'ora corrente. ecco come lavoro: se l'ora corrente è maggiore di 11 e minore di 17,

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

ma come?

 
Tigerfreerun:

È un po' complicato per me. Potresti spiegare in quale parte del codice aggiungere e cosa significa mn e mag_n? dove dovrei mettere il mio EA medjic qui?

Prima che la tua condizione metta

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

mag_n - dove posso mettere il mio EA's IG qui?

 
PolarSeaman:

Sto scrivendo: se l'ora corrente è più di 11 e meno di 17, come dovrebbe essere?

Capisco che la domanda riguarda l'indicatore. Invece diOra() -> tempo[i]

 
Vitaly Muzichenko:

Ho capito che la domanda riguarda l'indicatore. Invece diOra() -> tempo[i].

Sì, mi hai aiutato, ora voglio limitare il tempo. Escludere il conteggio dalle 17 alle 23.

  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;
         
        }
      
     }