beton2011

 
Уровень 14

  Моя торговля


График торгового счета beton2011


Группа "Стол заказов MQL"

Рейтинг 2146



РЕКОМЕНДУЮ



Советник Fractal-Market

Андрей, можно попросить написать советника. Собственно есть уже готовый но он некорректно работает, да и надо еще модифицировать немного.

Вот сам советник — market.mq4 (20 Kb)

Сам алгоритм работы советника я так и не понял, это надо смотреть в коде. Я попробую описать словами ТС.

Модификация советника

-Условие для открытия первого ордера на продажу-

Первый ордер открывается после появления фрактала над свечей.

Вместе с открытием ордера сразу выставляется отложенный ордер сэлл-лимит.

-Условие для открытия первого ордера на покупку-

Первый ордер открывается после появления фрактала под свечей.

Вместе с открытием ордера сразу выставляется отложенный ордер бай-лимит.

Дальше, на открытии новой свече советник подтягивает отложенный ордер ближе к цене открытия первого ордера, это если цена идет в нужном нам направление. Подтягивает на столько на сколько ушла цена от цены открытия последнего ордера, вроде бы как то так.

Закрытие всех ордеров после закрытия любого ордера по ТФ.

После того как советник открыл ордер по сигналу, он работает пока не закроется по ТП, потом останавливается и ждет следующего сигнала.

-Настройки советника-

Направление работы советника — buy — sell — buy-sell.

Тейк профит для первого ордера.

Расстояние для выставления первого отложенного ордера.

Расстояние для выставления отложенных ордеров после первого отложенного ордера, после первого отложенного ордера расстояние между ордеров увеличивается на Klot ( настраивается ).

Настройка увеличение лотов ордеров для отложенных ордеров.

Магик номер.

Вроде все, но лучше будет если вы сами посмотрите как работает советник и сделаете по ТС.

Спасибо
  • +1
  • Просмотров: 2888
  • 13 февраля 2016, 13:09
  • beton2011
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
Следующая запись в группе  
добавить функцию в советник Beton_Exp3.
13 февраля 2016
14 февраля 2016

Брокер для ваших роботов, 15 лет на рынке

Комментарии (27)

+
0
Я в понедельник смотреть буду, может даже проще с нуля переписать будет.
avatar

  35  AM2 Сообщений: 16254 - Андрей

  • 13 февраля 2016, 13:38
+
0
Спасибо. Желательно с нуля переписать, чтоб разобраться как он работает. Да и этот советник с глюками, на демо счете не закрывает ордера.Ну и добавить условия для открытия первого ордера.
Редактирован: 13 февраля 2016, 20:31
avatar

  14  beton2011 Автор Сообщений: 895

  • 13 февраля 2016, 20:23
+
0
Нет не возьмусь. Я с нуля пробовал писать, 3 часа просидел так и ничего не вышло толком.
avatar

  35  AM2 Сообщений: 16254 - Андрей

  • 14 февраля 2016, 14:19
+
0
Жалко конечно. Я могу новый топик написать? есть идея для создания советника по индикатору.
avatar

  14  beton2011 Автор Сообщений: 895

  • 14 февраля 2016, 14:35
+
0
За сложный не возьмусь сразу говорю.
avatar

  35  AM2 Сообщений: 16254 - Андрей

  • 14 февраля 2016, 14:40
+
+1
Вот этот вариант уже будет поближе к маркету.




//+------------------------------------------------------------------+
//|                                                FractalMarket.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"

//--- Inputs
extern double Lots          = 0.1; // лот
extern double MaxLot        = 5;   // максимальный торговый объем
extern double KLot          = 2;   // увеличение лота
extern int    StopLoss      = 100; // лось 
extern int    TakeProfit    = 900; // язь
extern int    Step          = 100; // расстояние от фрактала
extern int    Slip          = 30;  // проскальзывание
extern int    Shift         = 2;   // сдвиг баров назад
extern int    Expiration    = 14;  // время истечения в часах
extern int    Count         = 100; // количество открываемых ордеров
extern int    Magic         = 123; // магик

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountOrders(int ord)
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==ord) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()>1) del=OrderDelete(OrderTicket());
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int FindOrderType()
  {
   int oticket,ticketNumber=0,type=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            oticket=OrderTicket();
            if(oticket>ticketNumber)
              {
               ticketNumber=oticket;
               type=OrderType();
              }
           }
        }
     }
   return(type);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;
   datetime expiration=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0) sl=NormalizeDouble(price+StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0) sl=NormalizeDouble(price-StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
     }

   if(type>1) expiration=TimeCurrent()+Expiration*3600;

   r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,expiration,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ModifyOrders()
  {
   bool m;
   double count=0;
   double all=0,tp=0,sl=0;

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               all+=OrderOpenPrice()*OrderLots();
               count+=OrderLots();
              }
           }
        }
     }
   all=NormalizeDouble(all/count,Digits);

   for(i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               tp=NormalizeDouble(all+TakeProfit*Point,Digits);
               sl=NormalizeDouble(all-StopLoss*Point,Digits);
               if(OrderTakeProfit()!=tp || OrderStopLoss()!=sl) m=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
              }
            else
            if(OrderType()==OP_SELL)
              {
               tp=NormalizeDouble(all-TakeProfit*Point,Digits);
               sl=NormalizeDouble(all+StopLoss*Point,Digits);
               if(OrderTakeProfit()!=tp || OrderStopLoss()!=sl) m=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;
   if(CountTrades()>0) lot=NormalizeDouble(Lots*MathPow(KLot,CountTrades()),2);
   if(lot>MaxLot)lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   double up=0,dn=0,ma=0;
   int otype=FindOrderType();
//--- get ind
   up=iFractals(NULL,0,MODE_UPPER,Shift);
   dn=iFractals(NULL,0,MODE_LOWER,Shift);

// первый ордер
   if(up>0 && CountTrades()<1)//--- sell
     {
      if(CountOrders(1)<1) PutOrder(1,Bid);
     }

   if(dn>0 && CountTrades()<1)//--- buy 
     {
      if(CountOrders(0)<1) PutOrder(0,Ask);
     }

// отложки
   if(CountTrades()>0)
     {
      if(CountOrders(3)<1 && otype==1) PutOrder(3,Bid+Step*Point);//--- selllimit
      if(CountOrders(2)<1 && otype==0) PutOrder(2,Ask-Step*Point);//--- buylimit 
     }

// удаление отлоги если нет поз
   if(CountTrades()<1) DelOrder();

// один стоп всем позам
   if(CountTrades()>1) ModifyOrders();

   Comment("\n  UP Fractal: ",up,
           "\n  DN Fractal: ",dn,
           "\n  Trades: ",CountTrades(),
           "\n  Type: ",otype);
//---
  }
//+------------------------------------------------------------------+


Редактирован: 14 февраля 2016, 16:42
avatar

  35  AM2 Сообщений: 16254 - Андрей

  • 14 февраля 2016, 15:02
+
0
У вас почти получилось :)  Если получится, сделайте так чтоб открывал правильно отложенные ордера, если первый ордер открылся sell, значит отложенный ордер должен быть sell-limit, на покупку все наоборот. Еще желательно чтоб подтягивался ТП первого ордера, если начали срабатывать отложенные ордера, ТП подтягивается к последнему открытому ордеру. Тогда останется только подтягивание отложеного ордера, но это не важно.
avatar

  14  beton2011 Автор Сообщений: 895

  • 14 февраля 2016, 18:06
+
0
Сейчас есть все по ТЗ: www.opentraders.ru/downloads/1051/

avatar

  35  AM2 Сообщений: 16254 - Андрей

  • 14 февраля 2016, 17:53
+
0
Я за вами не успеваю. Почти все, если получится сделать подтягивание последнего отложенного ордера ближе к цене. Он должен вроде подтягивает на столько на сколько ушла цена от последнего открытого ордера. Если у вас это получится, тогда будет 100% по Т3.
Редактирован: 14 февраля 2016, 18:25
avatar

  14  beton2011 Автор Сообщений: 895

  • 14 февраля 2016, 18:24
+
0
Сейчас тащится: www.opentraders.ru/downloads/1051/

avatar

  35  AM2 Сообщений: 16254 - Андрей

  • 14 февраля 2016, 21:49
+
0
Да, все отлично работает. Можно последнюю просьбу, еще бы сделать отдельную настройку для увеличение расстояния для отложенных ордеров, а то сейчас как я понял расстояние увеличивается на Klot самих ордеров.
avatar

  14  beton2011 Автор Сообщений: 895

  • 14 февраля 2016, 22:40
+
0
avatar

  35  AM2 Сообщений: 16254 - Андрей

  • 15 февраля 2016, 11:07
+
0
Спасибо :) 
avatar

  14  beton2011 Автор Сообщений: 895

  • 15 февраля 2016, 11:47
+
0
Что то советник некорректно работает на демо счете. Бывает что не ставит отложенный ордер или не закрывает отложенный ордер. Посмотрите пожалуйсто. Может проблема в том что я поставил советника на разные валютные пары, вот и советник путается в ордерах, но я настраивал разные магик. В журнале терминала и эксперта ошибок нет.


Редактирован: 18 февраля 2016, 12:42
avatar

  14  beton2011 Автор Сообщений: 895

  • 18 февраля 2016, 12:29
+
0
На одной нормально работает?
avatar

  35  AM2 Сообщений: 16254 - Андрей

  • 18 февраля 2016, 20:13
+
0
Завтра протестирую. Думаю что все таки что то не так с магиком, путает ордера.
avatar

  14  beton2011 Автор Сообщений: 895

  • 18 февраля 2016, 20:20
+
0
На одной паре все нормально работает. Может в советник вставить кокой нибудь другой магик.
avatar

  14  beton2011 Автор Сообщений: 895

  • 19 февраля 2016, 11:45
+
0
Какой другой? :)  Есть еще вариант мультивалютный сделать.
avatar

  35  AM2 Сообщений: 16254 - Андрей

  • 19 февраля 2016, 12:02
+
0
Может просто сделать чтоб в самом советнике вводить валютную пару по которой будет торговать советник.
avatar

  14  beton2011 Автор Сообщений: 895

  • 19 февраля 2016, 12:23
+
0
Извините меня, но вы можете хоть что то отвечать когда вас просят о чем то, хотя бы да или нет.

По советнику все отлично, вот только не работает магик. Я заметил такую проблему и в других ваших советников.
avatar

  14  beton2011 Автор Сообщений: 895

  • 20 февраля 2016, 15:39
+
0
я ставил нормальный сов, хотел похвалить,*good*  нормально выставляет подтягивает и убирает,
как магик может не работать?
avatar

  16  cerber04 Сообщений: 409

  • 20 февраля 2016, 15:52
+
0
Извините меня, но вы можете хоть что то отвечать когда вас просят о чем то, хотя бы да или нет.

У меня тоже выходные есть :) 
avatar

  35  AM2 Сообщений: 16254 - Андрей

  • 20 февраля 2016, 17:01
+
0
Тогда понятно, отдыхать надо *yes* 

avatar

  14  beton2011 Автор Сообщений: 895

  • 20 февраля 2016, 18:00
+
0
Андрей, может вы хоть подскажите что можно еще сделать чтоб советник различал ордера на разных валютных парах.

Есть идея, может в советнике добавить еще настройки магика. Скажем, добавить в советник еще 10-ть Magic, будет типа Magic1-Magic2-Magic3-Magic4-Magic5 и т.д. так чтоб можно было отключить 9-ть и оставить один на одну валютную пру, и так сделать на все валютные пары, может тогда советник будет различать ордера.
avatar

  14  beton2011 Автор Сообщений: 895

  • 22 февраля 2016, 18:06
+
+1
Может еще попробовать такую конструкцию перебора ордеров как в илане:


int CountTrades()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      bool s=OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber) continue;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
         if(OrderType()==OP_SELL || OrderType()==OP_BUY) count++;
     }
   return (count);
  }
avatar

  35  AM2 Сообщений: 16254 - Андрей

  • 22 февраля 2016, 18:59
+
0
Поменял перебор ордеров: www.opentraders.ru/downloads/1051/

avatar

  35  AM2 Сообщений: 16254 - Андрей

  • 23 февраля 2016, 01:00
+
0
Спасибо.
avatar

  14  beton2011 Автор Сообщений: 895

  • 23 февраля 2016, 07:24

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий