Тестирую МТ5 с хеджем на демо - страница 2

 
samsuser3:
А какой  код на закрытие позиции ?

Да, вот соорудил из подручного материала сов из статьи https://www.mql5.com/ru/articles/132 немного переделал...добавил в импульсник из статьи https://www.mql5.com/ru/articles/2404 вот и получилась такая каша... я любитель смешивать  так вот экспериментирую и смотрю что в результате...))

CStrategyList Manager;
#include <TradeAlgorithms.mqh>
#include <ExpertAdvisor.mqh>
#include <Trade\DealInfo.mqh>

input double Lots=0.10;  // Лот
input double LotKoef=1; // множитель для лота при убытке
input int DistS=30;      // расстояние до стоплоса и тейкпрофита
input int DistP=16;      // расстояние до стоплоса и тейкпрофита

//---
class CMartiEA : public CExpertAdvisor
  {
protected:
   double            m_lots;       // Лот
   double            m_lotkoef;    // множитель для лота при убытке
   int               m_distP;       // расстояние до стоплоса и тейкпрофита
   int               m_distS;       // расстояние до стоплоса и тейкпрофита

   CDealInfo         m_deal;       // последняя сделка
   bool              m_first;      // флаг открытия первой сделки

public:
   void CMartiEA() { }
   void ~CMartiEA() { }
   virtual bool      Init(string smb,ENUM_TIMEFRAMES tf); // инициализация
   virtual void      OpenPositionBuy();
   virtual void      OpenPositionSell();

   virtual void      CheckPosition();
  };
//------------------------------------------------------------------    Init
bool CMartiEA::Init(string smb,ENUM_TIMEFRAMES tf)
  {
   if(!CExpertAdvisor::Init(0,smb,tf)) return(false); // инициализация родительского класса
   m_lots=Lots; m_lotkoef=LotKoef; m_distS=DistS;m_distP=DistP;       // скопировали параметры
   m_deal.Ticket(0); m_first=true;
   m_bInit=true; return(true);                        // "торговля разрешена"
  }
//------------------------------------------------------------------    OnTrade
void CMartiEA::OpenPositionBuy()
  {
   if(!CExpertAdvisor::Main()) return;                       // вызов родительской функции
   if(!m_first) return;                                      // если уже открывали начальную позицию
   ulong deal=DealOpen(ORDER_TYPE_BUY,m_lots,m_distP,m_distS); // открыли начальную позицию
   if(deal>0) { m_deal.Ticket(deal); m_first=false; }        // если позиция существует
  }
//------------------------------------------------------------------    OnTrade
void CMartiEA::OpenPositionSell()
  {
   if(!CExpertAdvisor::Main()) return;                       // вызов родительской функции
   if(!m_first) return;                                      // если уже открывали начальную позицию
   ulong deal=DealOpen(ORDER_TYPE_SELL,m_lots,m_distP,m_distS); // открыли начальную позицию
   if(deal>0) { m_deal.Ticket(deal); m_first=false; }        // если позиция существует
  }
  
//------------------------------------------------------------------    OnTrade
void CMartiEA::CheckPosition()
  {
   if(!CExpertAdvisor::Main()) return; // вызов родительской функции
   if(m_first) return;                 // если еще не открыли начальную позицию
   if(PositionSelect(m_smb)) return;   // если позиция существует

   // проферяем профит предыдущей позиции
   double lot=volume();                       // начальный лот
   long dir=m_deal.Type();                  // предыдущее направление
   if(CountProfitByDeal(m_deal.Ticket())<0) // если был убыток
     {
      lot=NormalLot(m_lotkoef*m_deal.volume()); // увеличили лот
      dir=ReversType(m_deal.Type());            // перевернули позицию
     }
   ulong deal=DealOpen(dir,lot,m_distP,m_distS); // открыли позицию
   if(deal>0) m_deal.Ticket(deal);             // запомнили тикет
  }

CMartiEA ea; // экземпляр объекта                                                           |
//+------------------------------------------------------------------+
double volume()
  {
   Lot=AccountInfoDouble(ACCOUNT_FREEMARGIN)/20000;
   Lot=MathMin(0.4,MathMax(0.1,Lot));
   Lot=NormalizeDouble(Lot,2);
   return(Lot);
  }
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
       ea.Init(Symbol(),Period()); // инициализируем эксперт
         rsiHandle=iRSI(NULL,0,RSIPeriod,PRICE_CLOSE);

//---
   CImpulse* impulse = new CImpulse();
   impulse.ExpertMagic(1218);
   impulse.Timeframe(Period());
   impulse.ExpertSymbol(Symbol());
   impulse.ExpertName("Impulse");
   impulse.Moving.MaPeriod(1600);                      
   impulse.SetPercent(StopPercent);
   if(!Manager.AddStrategy(impulse))
      delete impulse;
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
       ea.OpenPositionBuy(); // обрабатываем тик - открываем первый одрера

//---
   Manager.OnTick();
   
Прототип торгового робота
Прототип торгового робота
  • 2010.08.16
  • o_O
  • www.mql5.com
Целью данной статьи является обобщение и систематизация принципов создания алгоритмов и элементов торговых систем. В статье рассматривается вопрос проектирования алгоритма работы эксперта, в качестве примера представлен класс CExpertAdvisor, который может быть использован для быстрой и удобной разработки торговых систем.
 
Alexey Volchanskiy:
1 апреля уже прошло )
Такую шутку не придумать...что было то было...))
 
Сергей спасибо за код и ссылки  на  статьи .
 
Сергей Криушин:
Выходит - советник только сделал вид что выгрузился, потому что опять появился... вообще с МТ5 пока одни неудачи...нужно очень крепко все предусматривать... Вот недавно слил депо с помощью этого сова https://www.mql5.com/ru/code/12641 - поставил его параллельно к основному для управления им... так этот стал быстро все  закрывать, а основной наоборот по своей программе все открывать...депо в одну секунду и улетел...вот так поэкспериментировал... по недомыслию и непониманию принципа работы слил депо...

  А ведь и я пока  так  думаю ....

 Но мне многое нравится  в МТ5


 Сделали бы разработчики закрытие поз такое же  как в МТ4

 
samsuser3:

  А ведь и я пока  так  думаю ....

 Но мне многое нравится  в МТ5


 Сделали бы разработчики закрытие поз такое же  как в МТ4

samsuser3:
Сергей спасибо за код и ссылки  на  статьи .
Да не за что у меня таких миксов штук 300, а если с МТ4 - то и вся тысяча если не больше... так лепил по мере обучения и набора опыта... так сказать методом погружения...))
 
Сергей Криушин:

Да, вот соорудил из подручного материала сов из статьи https://www.mql5.com/ru/articles/132 немного переделал...добавил в импульсник из статьи https://www.mql5.com/ru/articles/2404 вот и получилась такая каша... я любитель смешивать  так вот экспериментирую и смотрю что в результате...))

Зря я тут похоже делили по OpenPositionBuy Sell думал в хедже будут выставляться раздельно, но чего-то в супе не хватает...очень много выставляет и не пойму как ограничить этот поток...вернул все обратно  - правильней наверно, будет использовать другой код из этой статьи https://www.mql5.com/ru/articles/132 - для работы по времени...

	          
Прототип торгового робота
Прототип торгового робота
  • 2010.08.16
  • o_O
  • www.mql5.com
Целью данной статьи является обобщение и систематизация принципов создания алгоритмов и элементов торговых систем. В статье рассматривается вопрос проектирования алгоритма работы эксперта, в качестве примера представлен класс CExpertAdvisor, который может быть использован для быстрой и удобной разработки торговых систем.
 
Alexey Volchanskiy:
Можно условно считать, что работает, как и в 4-ке, только приказы другие. Пользуйтесь стандартной библиотекой, там хедж уже предусмотрен и определяется автоматом.
Не подскажите, что лучше использовать торговые функции или торговые классы и почему?
 
Сергей Криушин:
Выходит - советник только сделал вид что выгрузился, потому что опять появился... вообще с МТ5 пока одни неудачи...нужно очень крепко все предусматривать... Вот недавно слил депо с помощью этого сова https://www.mql5.com/ru/code/12641 - поставил его параллельно к основному для управления им... так этот стал быстро все  закрывать, а основной наоборот по своей программе все открывать...депо в одну секунду и улетел...вот так поэкспериментировал... по недомыслию и непониманию принципа работы слил депо...

Обязательно делайте проверку "нового бара", чтобы следующий входы были на следующих барах. Если все-таки несколько сделок на одном баре, то как минимум таймер нужен.

 
forexman77:

Обязательно делайте проверку "нового бара", чтобы следующий входы были на следующих барах. Если все-таки несколько сделок на одном баре, то как минимум таймер нужен.

Действительно, думаете, что без таймера не обойтись?