Переписать код с mql4 в mql5 - страница 2

 
Aibek Mugiynov:
Неужели такой сложный язык mql5))  Весь рунет перерыл, нету ни одной темы подходящей...

Наверное всем лениво...

Ответ:

1. Получаешь хендл индикатора

2. По этому хендлу копируешь в массив значения буфера индикатора

3. В массиве находишь непустое значение

Примерно так...

 
Alexey Viktorov:

Наверное всем лениво...

Ответ:

1. Получаешь хендл индикатора

2. По этому хендлу копируешь в массив значения буфера индикатора

3. В массиве находишь непустое значение

Примерно так...

int    i, k=Bars(_Symbol, 0), ke=0;
for (i=1; i<k; i--)
Этот код всё портит, а без него никак... я просто не знаю как получить экстремумы индикатора зигзаг...Была бы хотя инфа че и как я бы не поленился прочитать всё, но пока не нашел тему имеено связанную с зигзагом т.е получения экстремумов))
 

вот тебе в помощь для перехода с MQL4 наMQ5, готовые функции

https://www.mql5.com/ru/articles/81 

Переход с MQL4 на MQL5
Переход с MQL4 на MQL5
  • 2010.05.11
  • Sergey Pavlov
  • www.mql5.com
Данная статья, построенная в форме справочника по функциям MQL4, призвана помочь переходу с MQL4 на MQL5. Для каждой функции языка MQL4 приведено описание и представлен способ ее реализации на MQL5, что позволит вам значительно ускорить перевод своих программ с MQL4 на MQL5. Для удобства функции разбиты на группы, как в документации по MQL4.
 
Спасибо!) 
 
В общем итог... Пробовал массу вариантов, не получилось поработать с индикатором зигзаг... Видимо его код сильно отличается от кода mql4... 
 
всем привет. Ребята, помогите переделать советник в mq5. В mt4 толком не тестируется. 

#property copyright   ""
#property link        "http://"
#property version     "mod1_0ll"
#property description ""
                      
         
#property strict

#include <stderror.mqh>            
#include <stdlib.mqh>              

extern double Lots        = 0.01;      //Размер фикс. лота
extern double MaxRisk     = 0;         //Риск на 1 ордер
extern double TakeProfit  = 50;
extern double StopLoss    = 10;        //Дистанция от края свечи (0 или 1) (не от цены!)
extern int TrailingStop   = 7;
extern int TrailingStep   = 4;
extern bool Trail2BU      = true;      //Трал включать после БУ, перевод в БУ с дистанцией
                                       //до цены = TrailingStop
extern int PriceStep      = 10;        //Дистанция от тек. цены до входа
extern int TimeStep       = 15;        //Время действия дистанции до переноса
extern int Close2XMin     = 10;        //Закрытие сделки в минутах, если не вышла в (+)
extern int Slipage        = 2;
extern int MaxTrades      = 5;
extern int Magic          = 22011;
extern string Com         = "DS_";     //Коментарий к ордерам

datetime time;
bool sigN=true, testing=false, SignalBuy=true, SignalSell=true, BU[2];
double dn, up, prc_BU[2], oSL[2];
int oCount[2];

int OnInit()
{  
    if (Digits == 3 || Digits == 5)
   {
      Slipage  *= 10;
      PriceStep  *= 10;
      TakeProfit  *= 10;
      StopLoss  *= 10;
      TrailingStop  *= 10;
      TrailingStep  *= 10;
   }
   BU[OP_BUY] = BU[OP_SELL] = Trail2BU;
   if(TimeStep<=0)TimeStep = 15;   
   return(INIT_SUCCEEDED);
}

void OnTick()
{
   if(DayOfWeek() == 5 && Hour() >= 22) {  CloseAllOrders(OP_BUY); CloseAllOrders(OP_SELL); return; }

   time=TimeCurrent(); 
   static datetime tim;
   if(time >= tim)  { sigN=true; tim = time+TimeStep; }

   if(sigN)
   {
      up = Ask+PriceStep*_Point;
      dn = Bid-PriceStep*_Point;
      sigN=false;
      SignalBuy=true;
      SignalSell=true;
   }
   int ticket=-1, oCnt = ordCount();
   double oLot=0;
   if(SignalBuy)
   {
      if(up>0.0 && !(up-Ask>_Point))
      {
         if (oCnt <= MaxTrades - 1)
         {
            if (oSL[OP_BUY] == 0) oSL[OP_BUY] = MathMin(Low[1], Low[0]) - StopLoss*_Point;
            oLot = LotByRisk((Ask - oSL[OP_BUY])/_Point);
            ticket = OrderSend (Symbol(), OP_BUY, oLot, Ask, Slipage, 0, 0, Com, Magic, 0, Blue);
            if (ticket >= 0) 
            {
               //Вычисление ТР через средний ХЛ свечи
               OrderSelect(ticket, SELECT_BY_TICKET);
               OrderModify(OrderTicket(), OrderOpenPrice(), oSL[OP_BUY], Ask+TakeProfit*_Point, 0);
               oCnt++;
            }
         }
         SignalBuy=false;
      }
   }
   if(SignalSell)
   {
      if(dn>0.0 && !(Bid-dn>_Point))
      {
         if (oCnt <= MaxTrades - 1)
         {
            if (oSL[OP_SELL] == 0) oSL[OP_SELL] = MathMax(High[1],High[0]) + StopLoss*_Point;
            oLot = LotByRisk((oSL[OP_SELL] - Bid)/_Point);
            ticket = OrderSend (Symbol(), OP_SELL, oLot, Bid, Slipage, 0, 0, Com, Magic, 0, Red);
            if (ticket >= 0)
            {
               //Вычисление ТР через средний ХЛ свечи
               OrderSelect(ticket, SELECT_BY_TICKET);
               OrderModify(OrderTicket(), OrderOpenPrice(), oSL[OP_SELL], Bid-TakeProfit*_Point, 0);
               oCnt++;
            }
         }
         SignalSell=false;
      }
   }
   if(TrailingStop>0 && oCnt>0)  MoveTrailingStop();

}
//EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE

int ordCount()
{
   int count = 0, otype;
   double oSumlot[2]={0.0,0.0}, oSumLotPrs[2]={0.0,0.0}, Profit[2]={0.0,0.0};
   bool flClose[2]={false,false};
   oCount[OP_BUY ] = oCount[OP_SELL] = 0;
   for (int i = OrdersTotal() - 1; i >= 0; i --)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic && OrderType() < 2)
      {
         otype = OrderType();
         count ++;
         oCount[otype]++;
         Profit[otype] += OrderProfit()+OrderCommission()+OrderSwap();
         oSumlot[otype] += OrderLots();
         oSumLotPrs[otype] += OrderLots() * OrderOpenPrice();
         flClose[otype] = TimeCurrent() - OrderOpenTime() > Close2XMin*60;
      }
   }
   if (oCount[OP_BUY ] == 0)  {  oSL[OP_BUY ] = 0; BU[OP_BUY ] = Trail2BU; }
   else
   {
      if (flClose[OP_BUY ]) { if (Profit[OP_BUY ] < 0) CloseAllOrders(OP_BUY ); else flClose[OP_BUY ] = false; }
      if (oSumlot[OP_BUY ]>0) prc_BU[OP_BUY ] = NormalizeDouble(oSumLotPrs[OP_BUY ] / oSumlot[OP_BUY ], _Digits);
   }
   if (oCount[OP_SELL] == 0)  {  oSL[OP_SELL] = 0; BU[OP_SELL] = Trail2BU; }
   else
   {
      if (flClose[OP_SELL]) { if (Profit[OP_SELL] < 0) CloseAllOrders(OP_SELL); else flClose[OP_BUY ] = false; }
      if (oSumlot[OP_SELL]>0) prc_BU[OP_SELL] = NormalizeDouble(oSumLotPrs[OP_SELL] / oSumlot[OP_SELL], _Digits);
   }

return (count);
}

double LotByRisk(double SL)
{
   if (MaxRisk <= 0) return(Lots);
   double Free    = AccountFreeMargin();
   double LotVal  = MarketInfo(_Symbol,MODE_TICKVALUE);
   double Min_Lot = MarketInfo(_Symbol,MODE_MINLOT);
   double Max_Lot = MarketInfo(_Symbol,MODE_MAXLOT);
   double Step1   = MarketInfo(_Symbol,MODE_LOTSTEP);
   double Lot     = MathFloor((Free*MaxRisk/100)/(SL*LotVal)/Step1)*Step1;
   if(Lot<Min_Lot) Lot=Min_Lot;
   if(Lot>Max_Lot) Lot=Max_Lot;
return(Lot);
}

void MoveTrailingStop()
{
   if(TrailingStop<=0)  return;
   double newSL, SLB, SLS;  bool res;
   SLB = (BU[OP_BUY ] && oCount[OP_BUY ] < 2) ? prc_BU[OP_BUY ] : oSL[OP_BUY];
   SLS = (BU[OP_SELL] && oCount[OP_SELL] < 2) ? prc_BU[OP_SELL] : oSL[OP_SELL];

   for(int cnt=0; cnt<OrdersTotal(); cnt++)
   {
      if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) continue;
      if(!(OrderSymbol() ==_Symbol && OrderMagicNumber() == Magic)) continue;
      if(OrderType()==OP_BUY)
      {
         newSL = NormalizeDouble(Bid - TrailingStop *_Point,_Digits);
         if(SLB < newSL - TrailingStep *_Point || OrderStopLoss() <= 0)
         {
            if (OrderStopLoss() > 0) BU[OP_BUY ] = false;
            res = OrderModify(OrderTicket(), OrderOpenPrice(), newSL, OrderTakeProfit(), 0, Green);
            if (res) oSL[OP_BUY] = newSL;
         }
      }
      if(OrderType()==OP_SELL)
      {
         newSL = NormalizeDouble(Ask + TrailingStop *_Point,_Digits);
         if(SLS > newSL + TrailingStep *_Point || OrderStopLoss() <= 0)
         {
            if (OrderStopLoss() > 0) BU[OP_SELL] = false;
            res = OrderModify(OrderTicket(), OrderOpenPrice(), newSL, OrderTakeProfit(), 0, Red);
            if (res) oSL[OP_SELL] = newSL;
         }
      }
   }
}

void CloseAllOrders(int dir)
{
   double prc = (dir == OP_BUY) ? Bid : Ask;
   for(int cnt = OrdersTotal()-1;cnt >= 0; cnt--)
   {
      if( !OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) ) continue;
      if( OrderSymbol()==Symbol() && OrderMagicNumber() == Magic && OrderType() == dir)
      {
      bool res = OrderClose(OrderTicket(), OrderLots(), prc, Slipage, Gray);
      }
   }
}  
Как заказать торгового робота на MQL5 и MQL4
Как заказать торгового робота на MQL5 и MQL4
  • www.mql5.com
Сервис "Фриланс" является самой большой биржей для заказа торговых роботов и технических индикаторов. Сотни профессиональных разработчиков готовы написать торговое приложение для терминала MetaTrader 4/5.
 
С тебя пиво !
Файлы:
321.ex5  136 kb
Причина обращения: