Встречайте бета-версию MetaTrader 5 с хеджингом и новым руководством пользователя - страница 2

 
Slawa:

Ну так это конечно так.

Символ одинаковый, мейджик одинаковый. Какую позицию выбирать? Работайте с тикетом позиции. Тикет у каждой позиции уникален

В цикле проверяю нужный тикет, все равно тоже самое

   int total=PositionsTotal();
   for(int i=total-1; i>=0; i--)
     {
      if(PositionGetSymbol(i)==symbol)
        {
         //if(PositionGetInteger(POSITION_MAGIC)==Magic)
         //  {
         if(PositionGetInteger(POSITION_IDENTIFIER)==ID)
           {
            if(PositionGetDouble(POSITION_TP)==0)
              {
               if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
                 {
                  sl=PositionGetDouble(POSITION_SL);
                  tp=NormalizeDouble(normalize(symbol,bid+tp*point),digits);
                  if(tp>0)trade.PositionModify(symbol,sl,tp);
                 }
               if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
                 {
                  sl=PositionGetDouble(POSITION_SL);
                  tp=NormalizeDouble(normalize(symbol,ask-tp*point),digits);
                  if(tp>0)trade.PositionModify(symbol,sl,tp);
                 }
              }
           }
         //}
        }
     }

 

 не хватает стандартной функции типа

bool  SelectByPosition( 
   long   position_id     // идентификатор позиции - POSITION_IDENTIFIER 
   );
 

В тестере тоже самое происходит. Набросал новый код для тестера.

//+------------------------------------------------------------------+
//|                                                      Test_06.mq5 |
//|                                                   Sergey Gritsay |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\Trade.mqh>
#include <Trade\AccountInfo.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
enum ENUM_TYPE
  {
   BUY=ORDER_TYPE_BUY,
   SELL=ORDER_TYPE_SELL
  };
input ulong Magic=12;
input ENUM_TYPE Type_open=BUY;
input double Lot=0.01;
input int SL=300;
input int TP=300;
input bool TrailingStop=false;

CTrade trade;
CAccountInfo AccountInfo;

long ID=0;
datetime curbar;
datetime lastbar;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   trade.SetExpertMagicNumber(Magic);
   trade.SetMarginMode();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(NewBar(_Symbol,PERIOD_CURRENT))
      Open(_Symbol,(ENUM_ORDER_TYPE)Type_open,Lot);

   ModifySL(_Symbol,(double)SL);
   ModifyTP(_Symbol,(double)TP);
  }
//+------------------------------------------------------------------+
bool NewBar(string symbol,ENUM_TIMEFRAMES  period)
  {
   curbar=(datetime) SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);

   if(lastbar==0)lastbar=(datetime)SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);
   if(lastbar!=curbar)
     {
      lastbar=curbar;
      return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+
bool Open(string symbol,ENUM_ORDER_TYPE type,double Volume)
  {
   int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
   Volume=volume_n(symbol,Volume);
   if(type==ORDER_TYPE_BUY)
     {
      double ask=NormalizeDouble(SymbolInfoDouble(symbol,SYMBOL_ASK),digits);
      if(NormalizeDouble(normalize(symbol,ask),digits)!=ask)return(false);
      if(AccountInfo.FreeMarginCheck(symbol,type,Volume,ask)<=0.0)return(false);
      trade.Buy(Volume,symbol,ask);
     }
   if(type==ORDER_TYPE_SELL)
     {
      double bid=NormalizeDouble(SymbolInfoDouble(symbol,SYMBOL_BID),digits);
      if(NormalizeDouble(normalize(symbol,bid),digits)!=bid)return(false);
      if(AccountInfo.FreeMarginCheck(symbol,type,Volume,bid)<=0.0)return(false);
      trade.Sell(Volume,symbol,bid);
     }
   if(trade.ResultRetcode()==TRADE_RETCODE_DONE || trade.ResultRetcode()==TRADE_RETCODE_DONE_PARTIAL)
     {
      ID=PositionID(trade.ResultDeal());
      Print(symbol,": ID = ",ID);
      Print(symbol,": ResultDeal() = ",trade.ResultDeal());
      return(true);
     }
   else return(false);
  }
//+------------------------------------------------------------------+
long PositionID(ulong tiket)
  {
   ulong deal_ticket=tiket;
   if(HistorySelect(0,TimeCurrent()))
     {
      int deals=HistoryDealsTotal();
      for(int i=0;i<deals;i++)
        {
         deal_ticket=HistoryDealGetTicket(i);
         if(deal_ticket!=tiket)continue;
         else break;
        }
     }
   return((long)HistoryDealGetInteger(deal_ticket,DEAL_POSITION_ID));
  }
//+------------------------------------------------------------------+
double normalize(string symbol,double value)
  {
   double ts=SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_SIZE);
   if(ts==0)return(value);
   return(NormalizeDouble(value/ts,0)*ts);
  }
//+------------------------------------------------------------------+
double volume_n(string symbol,double lot)
  {
   double MinLot=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double MaxLot=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double LotStep=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);

   if(lot<MinLot)lot=MinLot;
   if(lot>MaxLot)lot=MaxLot;

   if(LotStep==0.001) return(NormalizeDouble(lot,3));
   if(LotStep==0.01)  return(NormalizeDouble(lot,2));
   if(LotStep==0.1)   return(NormalizeDouble(lot,1));

   return(NormalizeDouble(lot,0));
  }
//+------------------------------------------------------------------+
void ModifySL(string symbol,double sl)
  {
   if(sl<0)return;
   double price=0.0;
   double tp=0.0;
   double last=SymbolInfoDouble(symbol,SYMBOL_LAST);
   double bid=SymbolInfoDouble(symbol,SYMBOL_BID);
   double ask=SymbolInfoDouble(symbol,SYMBOL_ASK);
   double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
   int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);

   if(last<=0.0)
     {
      bid=SymbolInfoDouble(symbol,SYMBOL_BID);
      ask=SymbolInfoDouble(symbol,SYMBOL_ASK);
     }
   else
     {
      bid=SymbolInfoDouble(symbol,SYMBOL_LAST);
      ask=SymbolInfoDouble(symbol,SYMBOL_LAST);
     }

   if(bid<=0.0)return;
   if(ask<=0.0)return;

   int total=PositionsTotal();
   for(int i=0;i<total;i++)
     {
      if(PositionGetSymbol(i)==symbol)
        {
         //Print(__FUNCTION__,": PositionGetSymbol(i) ",PositionGetSymbol(i));
         if(PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            //Print(__FUNCTION__,": PositionGetInteger(POSITION_MAGIC) ",PositionGetInteger(POSITION_MAGIC));
            if(PositionGetInteger(POSITION_IDENTIFIER)==ID)
              {
               //Print(__FUNCTION__,": PositionGetInteger(POSITION_IDENTIFIER) ",PositionGetInteger(POSITION_IDENTIFIER)," ID = ",ID);
               if(PositionGetDouble(POSITION_SL)==0)
                 {
                  //Print(__FUNCTION__,": PositionGetDouble(POSITION_SL) ",PositionGetDouble(POSITION_SL));
                  if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
                    {
                     sl=NormalizeDouble(normalize(symbol,bid-sl*point),digits);
                     tp=PositionGetDouble(POSITION_TP);
                     Print(__FUNCTION__,": sl = ",sl," tp = ",tp);
                     if(sl>0)trade.PositionModify(symbol,sl,tp);
                    }
                  if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
                    {
                     sl=NormalizeDouble(normalize(symbol,ask+sl*point),digits);
                     tp=PositionGetDouble(POSITION_TP);
                     Print(__FUNCTION__,": sl = ",sl," tp = ",tp);
                     if(sl>0)trade.PositionModify(symbol,sl,tp);
                    }
                 }
               else
                 {
                  if(TrailingStop)
                    {
                     if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
                       {
                        sl=NormalizeDouble(normalize(symbol,bid-sl*point),digits);
                        tp=PositionGetDouble(POSITION_TP);
                        Print(__FUNCTION__,": sl = ",sl," tp = ",tp);
                        if(sl>PositionGetDouble(POSITION_SL))
                           if(sl>0)trade.PositionModify(symbol,sl,tp);
                       }
                     if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
                       {
                        sl=NormalizeDouble(normalize(symbol,ask+sl*point),digits);
                        tp=PositionGetDouble(POSITION_TP);
                        Print(__FUNCTION__,": sl = ",sl," tp = ",tp);
                        if(sl<PositionGetDouble(POSITION_SL))
                           if(sl>0)trade.PositionModify(symbol,sl,tp);
                       }
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
void ModifyTP(string symbol,double tp)
  {
   if(tp<0)return;
   double sl=0.0;
   double last=SymbolInfoDouble(symbol,SYMBOL_LAST);
   double bid=SymbolInfoDouble(symbol,SYMBOL_BID);
   double ask=SymbolInfoDouble(symbol,SYMBOL_ASK);
   double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
   int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);

   if(last<=0.0)
     {
      bid=SymbolInfoDouble(symbol,SYMBOL_BID);
      ask=SymbolInfoDouble(symbol,SYMBOL_ASK);
     }
   else
     {
      bid=SymbolInfoDouble(symbol,SYMBOL_LAST);
      ask=SymbolInfoDouble(symbol,SYMBOL_LAST);
     }

   if(bid<=0.0)return;
   if(ask<=0.0)return;

   int total=PositionsTotal();
   for(int i=0;i<total;i++)
     {
      if(PositionGetSymbol(i)==symbol)
        {
         //Print(__FUNCTION__,": PositionGetSymbol(i) ",PositionGetSymbol(i));
         if(PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            //Print(__FUNCTION__,": PositionGetInteger(POSITION_MAGIC) ",PositionGetInteger(POSITION_MAGIC));
            if(PositionGetInteger(POSITION_IDENTIFIER)==ID)
              {
               //Print(__FUNCTION__,": PositionGetInteger(POSITION_IDENTIFIER) ",PositionGetInteger(POSITION_IDENTIFIER)," ID = ",ID);
               if(PositionGetDouble(POSITION_TP)==0)
                 {
                  //Print(__FUNCTION__,": PositionGetDouble(POSITION_TP) ",PositionGetDouble(POSITION_TP));
                  if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
                    {
                     sl=PositionGetDouble(POSITION_SL);
                     tp=NormalizeDouble(normalize(symbol,bid+tp*point),digits);
                     Print(__FUNCTION__,": sl = ",sl," tp = ",tp);
                     if(tp>0)trade.PositionModify(symbol,sl,tp);
                    }
                  if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
                    {
                     sl=PositionGetDouble(POSITION_SL);
                     tp=NormalizeDouble(normalize(symbol,ask-tp*point),digits);
                     Print(__FUNCTION__,": sl = ",sl," tp = ",tp);
                     if(tp>0)trade.PositionModify(symbol,sl,tp);
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
Файлы:
Test_06.mq5  11 kb
 
Sergey Gritsay:

В цикле проверяю нужный тикет, все равно тоже самое

 

 не хватает стандартной функции типа

PositionSelectByTicket
 
скажите Хедж можно будет торговать на любых брокерах, или это по выбору брокера? мне просто чтоб знать, пока нет времени все эксперты переписывать под новую систему. 
 
Ясно, в документации MetaEditora ее не нашел. Попробую переписать тест с модификацией с ее помощью, посмотрим что выйдет
 
Sergey Gritsay:
Ясно, в документации MetaEditora ее не нашел. Попробую переписать тест с модификацией с ее помощью, посмотрим что выйдет

Все дело оказалось в методе PositionModify() класса CTrade, для хеджинковых счетов нужно использовать второй вариант, раньше был только один вариант метода

 

bool  PositionModify( 
   const ulong   ticket,     // тикет позиции 
   double        sl,         // цена Stop Loss  
   double        tp          // цена Take Profit 
   )
 

а когда ожидать на реальных счетах данную версию?

и кто нить знает = исправили в этой версии ошибку в передаче направленности сделки BUY SELL в свойствах ордера ( при торговле на бирже) ?

 
Igor Volodin:
В 1281 по сравнению с 1274 заметно увеличилась скорость подготовки к оптимизации и сам процесс. 

    Просветите пожалуйста, - как скачать версию 1281 ? У меня с Metaquotes постоянно скачивается только 1241 и никак не иначе... не получается(

да и в такой версии (1241) не дают открыть демосчёт под новую, хеджинговую версию на демосерверах.

Или в воскресенье на серверах выходные дни ? 

СПАСИБО. 

 
akarustam:

    Просветите пожалуйста, - как скачать версию 1281 ? У меня постоянно скачивается только 1241 и никак не иначе не получается... да и в такой версии (1241) не дают открыть демосчёт под новую, хеджинговую версию на демосерверах. Или в воскресенье на серверах выходные дни ? 

СПАСИБО. 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

А когда новая версия MT5 и где узнать что в ней ожидается

Karputov Vladimir, 2016.03.21 09:52

... Теперь (пока только на демо-сервере MetaQuotes-Demo) доступен новый тип торгового счёта - с включенным хеджированием. Для этого нужно завести новый демо торговый счёт на MetaQuotes-Demo и выбрать опцию "Использовать хеджирование при торговле":

MetaTrader 5. Использование хеджирования 

 

На обычных торговых счетах MetaTRader 5 (неттинговых) правила остались прежние:


 
Karputov Vladimir:

Не знаю пока как вставить сюда наглядную картинку этапа (открытия демосчета), на котором "застрял" с открытием демосчёта, но после нажатия "Далее" в "Выборе типа счета" то ли зависает всё, то ли думает, таак долго... Сервер MetaQuotes-Demo сканируется нормально, вместе с ещё двумя другими серверами. Правильно-ли будет открыть реальный счет и не торговать на нём ? А вдруг и там "задумаются" на долго...
Причина обращения: