Инверсия торгвых приказов ведет к Граалю? - страница 4

 
Alexandr Bryzgalov:

дело в том, что инверсия делается не корректно, в этом вся беда )

для корректной инверсии нужно несколько счетов и желательно один онлайн обменник )

могу проконсультировать, как правильно сделать инверсию, но нужны средства не менее $10000 и столько же на другом(это минимум что бы понять что стратегия работает).

получится тупо арбитраж межбиржевой, на примете есть площадки


Это тяжело ) Есть варианты проще
 
Petr Doroshenko:
Не надо советников, сделайте лучше чтобы с moex отмечался в mt большой объем(например >1000) и его диапазон.

Может этот сгодится https://www.mql5.com/ru/forum/96537/2852515#comment_2852515
Загадочный биржевой индикатор
Загадочный биржевой индикатор
  • 2016.09.27
  • www.mql5.com
Ниже приведен сильно упрощенный (ООП полностью отсутствует) индикатор, который показывает проторгованный оборот на основании тиковой биржевой истор...
 
Alexey Volchanskiy:

Может я не понял мысль, но функцию закрытия я не менял. Только переворот открытия. Так все верно?

Как-же не менял? Вот ещё раз цитирую твой пост о закрытии ордеров

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

Инверсия торгвых приказов ведет к Граалю?

Alexey Volchanskiy, 2017.06.11 01:13

Забыл про закрытие ордеров написать, пусть будет отдельно, так понятнее

В оригинале имеем такой код, кстати, в тестах я его не менял, можно попробовать и тут сделать реверс

149   if(type==(long)POSITION_TYPE_BUY   && rt[0].open>ma[0] && rt[0].close<ma[0])
150      signal=true;
151   if(type==(long)POSITION_TYPE_SELL  && rt[0].open<ma[0] && rt[0].close>ma[0])
152      signal=true;

Для реверса делаем взаимозамену POSITION_TYPE_BUY и POSITION_TYPE_SELL

   if(type==(long)POSITION_TYPE_SELL   && rt[0].open>ma[0] && rt[0].close<ma[0])
      signal=true;
   if(type==(long)POSITION_TYPE_BUY  && rt[0].open<ma[0] && rt[0].close>ma[0])
      signal=true;

ВНИМАНИЕ: Все изменения делайте на копии исходного файла, а не на оригинале!



вот результат с начала 2016 года. Сверху оригинал, снизу реверсивное открытие. Условие закрытия не менял.


Вот код.

//+------------------------------------------------------------------+
//|                                          Moving Averages Rev.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#include <Trade\Trade.mqh>

input double   MaximumRisk       = 0.02;  // Maximum Risk in percentage
input double   DecreaseFactor    = 3;     // Descrease factor
input int      MovingPeriod      = 12;    // Moving Average period
input int      MovingShift       = 6;     // Moving Average shift
input int      MA_MAGIC          = 1234;  // MagicNumber
input bool     revers            = true;  // Revers trade
//---
int    ExtHandle=0;
bool   ExtHedging=false;
CTrade ExtTrade;

//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double TradeSizeOptimized(void)
  {
   double price=0.0;
   double margin=0.0;
//--- select lot size
   if(!SymbolInfoDouble(_Symbol,SYMBOL_ASK,price))
      return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin))
      return(0.0);
   if(margin<=0.0)
      return(0.0);

   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk/margin,2);
//--- calculate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      //--- select history for access
      HistorySelect(0,TimeCurrent());
      //---
      int    orders=HistoryDealsTotal();  // total history deals
      int    losses=0;                    // number of losses orders without a break

      for(int i=orders-1;i>=0;i--)
        {
         ulong ticket=HistoryDealGetTicket(i);
         if(ticket==0)
           {
            Print("HistoryDealGetTicket failed, no trade history");
            break;
           }
         //--- check symbol
         if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=_Symbol)
            continue;
         //--- check profit
         double profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
         if(profit>0.0)
            break;
         if(profit<0.0)
            losses++;
        }
      //---
      if(losses>1)
         lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   lot=stepvol*NormalizeDouble(lot/stepvol,0);

   double minvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol)
      lot=minvol;

   double maxvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   if(lot>maxvol)
      lot=maxvol;
//--- return trading volume
   return(lot);
  }
//+------------------------------------------------------------------+
//| Check for open position conditions                               |
//+------------------------------------------------------------------+
void CheckForOpen(void)
  {
   MqlRates rt[2];
//--- go trading only for first ticks of new bar
   if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }
   if(rt[1].tick_volume>1)
      return;
//--- get current Moving Average 
   double   ma[1];
   if(CopyBuffer(ExtHandle,0,0,1,ma)!=1)
     {
      Print("CopyBuffer from iMA failed, no data");
      return;
     }
//--- check signals
   ENUM_ORDER_TYPE signal=WRONG_VALUE;

   if(rt[0].open>ma[0] && rt[0].close<ma[0])
      signal=revers ? ORDER_TYPE_BUY : ORDER_TYPE_SELL;    // sell conditions
   else
     {
      if(rt[0].open<ma[0] && rt[0].close>ma[0])
         signal=revers ? ORDER_TYPE_SELL : ORDER_TYPE_BUY;  // buy conditions
     }
//--- additional checking
   if(signal!=WRONG_VALUE)
     {
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
         ExtTrade.PositionOpen(_Symbol,signal,TradeSizeOptimized(),
                               SymbolInfoDouble(_Symbol,signal==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK),
                               0,0);
     }
//---
  }
//+------------------------------------------------------------------+
//| Check for close position conditions                              |
//+------------------------------------------------------------------+
void CheckForClose(void)
  {
   MqlRates rt[2];
//--- go trading only for first ticks of new bar
   if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }
   if(rt[1].tick_volume>1)
      return;
//--- get current Moving Average 
   double   ma[1];
   if(CopyBuffer(ExtHandle,0,0,1,ma)!=1)
     {
      Print("CopyBuffer from iMA failed, no data");
      return;
     }
//--- positions already selected before
   bool signal=false;
   long type=PositionGetInteger(POSITION_TYPE);

   if(type==(long)POSITION_TYPE_BUY   && rt[0].open>ma[0] && rt[0].close<ma[0])
      signal=true;
   if(type==(long)POSITION_TYPE_SELL  && rt[0].open<ma[0] && rt[0].close>ma[0])
      signal=true;
//--- additional checking
   if(signal)
     {
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
         ExtTrade.PositionClose(_Symbol,3);
     }
//---
  }
//+------------------------------------------------------------------+
//| Position select depending on netting or hedging                  |
//+------------------------------------------------------------------+
bool SelectPosition()
  {
   bool res=false;
//---
   if(ExtHedging)
     {
      uint total=PositionsTotal();
      for(uint i=0; i<total; i++)
        {
         string position_symbol=PositionGetSymbol(i);
         if(_Symbol==position_symbol && MA_MAGIC==PositionGetInteger(POSITION_MAGIC))
           {
            res=true;
            break;
           }
        }
     }
   else
      res=PositionSelect(_Symbol);
//---
   return(res);
  }
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- prepare trade class to control positions if hedging mode is active
   ExtHedging=((ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING);
   ExtTrade.SetExpertMagicNumber(MA_MAGIC);
   ExtTrade.SetMarginMode();
   ExtTrade.SetTypeFillingBySymbol(Symbol());
//--- Moving Average indicator
   ExtHandle=iMA(_Symbol,_Period,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE);
   if(ExtHandle==INVALID_HANDLE)
     {
      printf("Error creating MA indicator");
      return(INIT_FAILED);
     }
//--- ok
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick(void)
  {
//---
   if(SelectPosition())
      CheckForClose();
   else
      CheckForOpen();
//---
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+

выделены изменения и дополнения. И magick вынес в input переменные.

 
Alexey Viktorov:

Вот код.

выделены изменения и дополнения. И magick вынес в input переменные.

Красиво. Спасибо.
 

У меня осталась не проверенной пионерская идея.

Вот изменения в стандартном индикаторе МА

//+------------------------------------------------------------------+
//|                                        Custom Moving Average.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"

//--- indicator settings
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
//--- input parameters
input int            InpMAPeriod=13;         // Period
input int                 Shift=0;           // ShiftSMA
input int            InpMAShift=0;           // Shift
input ENUM_MA_METHOD InpMAMethod=MODE_SMA;   // Method
//--- indicator buffers
double               ExtLineBuffer[];
//+------------------------------------------------------------------+
//|   simple moving average                                          |
//+------------------------------------------------------------------+
void CalculateSimpleMA(int rates_total,int prev_calculated,int begin,const double &price[])
  {
   int i,limit;
//--- first calculation or number of bars was changed
   if(prev_calculated==0)// first calculation
     {
      limit=InpMAPeriod+begin;
      //--- set empty value for first limit bars
      for(i=0;i<limit-1;i++) ExtLineBuffer[i]=0.0;
      //--- calculate first visible value
      double firstValue=0;
      for(i=begin;i<limit;i++)
         firstValue+=price[i];
      firstValue/=InpMAPeriod;
      ExtLineBuffer[limit-1]=firstValue;
     }
   else limit=prev_calculated-1;
//--- main loop
   for(i=limit;i<rates_total && !IsStopped();i++)
   if(i<=InpMAPeriod*10+begin)   ExtLineBuffer[i]=ExtLineBuffer[i-1]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;
   else                         ExtLineBuffer[i]=(ExtLineBuffer[i-1]*InpMAPeriod+price[i]-ExtLineBuffer[i-InpMAPeriod+Shift])/InpMAPeriod;
                     

Вот так выглядят изменения на графике при одном периоде (зеленая стандартный МА ):

 ShiftSMA  = +7 красная линия самая близкая к стандартной.  ShiftSMA = -5 самая амплитудная красная линия. При больших минусовых значениях попадает в резонанс и летает от плюс бесконечности до минус ...

Проявляется некая инерция, любопытно как скажется на результатах оптимизации.

Файлы:
 

1. Идея торговать вдругую сторону не нова.  появилась, еще как только появились первые сливаторы. Когдя я написал своего 5 -го сливатора, то подумал про переворот и на радостях даже не стал его тестить в тестере. Но почему такой робот тоже активно все сливал. 

2. Тут многие не верят тестеру, особенно в Мт4. А зря ! Прсто не умеете им пользоваться ! Ввиду алгоритма формирования свечи тестер просто не любит некоторых приемов торговли. Близкие стопы, тралы, подтягивания ордеров под цену. торговлю на новостях и в роловер. В остальном это мега инструмент для тестирования. В МТ5 на реальных тиках потестировал немного, но найти брокера с вменяемым спредом не получилось. 

3. Тут кто-то нелестно отозвался о штатном советнике на MA, а зря. На МТ4 в двух совтениках показан подход к написанию советников и различные приемы реализации идеи. Я как раз учился по этим примерам. 

 
Alexey Volchanskiy:

У меня есть доольно близкая вещь https://www.mql5.com/ru/code/17206

Напишите более подробно, как все должно выглядеть, я сделаю версию для объемов и в кодобазу выложу

Alexey Volchanskiy|Rafael Sahibgareevкак это видится:

0. Руками прошлись по вебграфику moex и вертикальными линиями отметили в терминале по времени баров - примитивно и не спортивно.

1. В реальном времени отразить определенный объем бара(1/10минут) с биржи moex в любом другом терминале mt. Объем(ы) терминала текущего брокера не интересны и живут своей жизнью.

2.1. Вроде возможно получение котировок с задержкой 15минут при подключение через mt. https://www.mql5.com/ru/forum/98459/page1

2.2. Вроде moex транслирует на свою вебстраницу котировки символа (запаздывает или нет хз не разбирался).

3.1. Индикатор одного терминала   пишет в файл запаздывающие на 15минут данные, а другой индикатор другого терминала читает файл и рисует на графике например прямоугольник на следующем баре за 1/10 минутами

3.2. Что-то парсит веб страницу moex и пишет в файл, а другой индикатор терминала читает этот файл и рисует на графике например прямоугольник на следующем баре за 1/10 минутами.

3.3.  Другой вариант

Т.е. именно moex и бар с определенным объемом определенного символа. Ни кластердельта ни тики текущего брокера.

Как подключиться к демо MOEX
Как подключиться к демо MOEX
  • 2016.10.21
  • www.mql5.com
Инструкция в картинках, как подключиться в демо-MOEX на торговом сервере MetaQuotes-Demo: 1. Меню "Файл" - "Открыть счёт ..." 2...
 
Petr Doroshenko:

Alexey Volchanskiy|Rafael Sahibgareevкак это видится:

0. Руками прошлись по вебграфику moex и вертикальными линиями отметили в терминале по времени баров - примитивно и не спортивно.

1. В реальном времени отразить определенный объем бара(1/10минут) с биржи moex в любом другом терминале mt. Объем(ы) терминала текущего брокера не интересны и живут своей жизнью.

2.1. Вроде возможно получение котировок с задержкой 15минут при подключение через mt. https://www.mql5.com/ru/forum/98459/page1

2.2. Вроде moex транслирует на свою вебстраницу котировки символа (запаздывает или нет хз не разбирался).

3.1. Индикатор одного терминала   пишет в файл запаздывающие на 15минут данные, а другой индикатор другого терминала читает файл и рисует на графике например прямоугольник на следующем баре за 1/10 минутами

3.2. Что-то парсит веб страницу moex и пишет в файл, а другой индикатор терминала читает этот файл и рисует на графике например прямоугольник на следующем баре за 1/10 минутами.

3.3.  Другой вариант

Т.е. именно moex и бар с определенным объемом определенного символа. Ни кластердельта ни тики текущего брокера.

Для начала - мне этот moex не нужен, я торгую на форе, если буду делать, чисто из интереса и в свободное время. Сейчас немного есть.

2.2 Это делать не буду.

3.1 А зачем нужно это разделение?

 
Alexey Volchanskiy:

Для начала - мне этот moex не нужен, я торгую на форе, если буду делать, чисто из интереса и в свободное время. Сейчас немного есть.

2.2 Это делать не буду.

3.1 А зачем нужно это разделение?

Ну я так и понял, что появилось свободное время )))

Например на форе зафиксировать открытую позицию. Сам moex со всем что там есть не нужен. 

Основано на предположении, что объемы(gbpu) за 1000 на бирже не с дурной головы запускают.

Объем инструмента на Moex, как индикатор - небольшой объем торговли(в конкретном случае gbpu) к движению или по другому - на moex проторговался существенный объем инструмента(небольшая группа лиц участников этой биржи приняла какие-то решения и решила войти/выйти), а мы посмотрели что из этого выходит/вышло(жираф большой, ему видней). Это как девушку первой в лифт пропустить - посмотрели (не)провалилась или этажем выше она опять этот номер повторяет, ну а мы если что следом(вход/выход). 

 
Petr Doroshenko:

Ну я так и понял, что появилось свободное время )))

Например на форе зафиксировать открытую позицию. Сам moex со всем что там есть не нужен. 

Основано на предположении, что объемы(gbpu) за 1000 на бирже не с дурной головы запускают.

Объем инструмента на Moex, как индикатор - небольшой объем торговли(в конкретном случае gbpu) к движению или по другому - на moex проторговался существенный объем инструмента(небольшая группа лиц участников этой биржи приняла какие-то решения и решила войти/выйти), а мы посмотрели что из этого выходит/вышло(жираф большой, ему видней). Это как девушку первой в лифт пропустить - посмотрели (не)провалилась или этажем выше она опять этот номер повторяет, ну а мы если что следом(вход/выход). 


То есть торговать будете на форе, а Моех используем, как индикатор объемов? Тогда все проще. С Моех с демо-счета (если это работает, проверю) берем объемы, они с задеркой. Я тоже слышал про 15 минут, это легко проверить. И накладываем их со смещением по времени на котировки форекс. И смотрим, есть ли взаимосвязь и что тут можно выжать. Вот тут хоть какой-то интерес.

Такой вариант пойдет?

Причина обращения: