vikas
Алексей

 
Уровень 9

  Торгую в компаниях:


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

Рейтинг 2088



РЕКОМЕНДУЮ



хеджирующий советник

Здравствуйте уважаемые программисты! Прошу написать хеджирующий советник по следующей стратегии:
По заданному условию открывается первый ордер buy либо sell (зависит от условия — скажем для buy: Open[1]<Close[1] && Open[0]>Close[1]
для sell: Open[1]>Close[1] && Open[0 ]<Close[1] ) Хотя не суть важно. У этого первого ордера
предположим buy, выставляется тейк профит и одновременно с ним на расстоянии N пунктов выставляется sellstop с увеличенным лотом. Если цена дошла до тейк профита-
sellstop удаляется и цикл начинается снова. Если цена пошла вниз и сработал sellstop-
тейк профит первого ордера удаляется и открывается buystop также с увеличенным лотом на уровне открытия первого ордера buy. Дальше если цена пошла вниз — ждём суммарного профита (в валюте) и закрываем все ордера. Если цена пошла вверх и сработал buystop — и цена пошла дальше — также ждём закрытия по суммарному профиту. И так далее.
Между ордерами sellstop и buystop всегда одинаковое расстояние заданное в меню.
stoploss ордеров не выставляется. Тейк профит выставляется только у первого ордера и удаляется после сработавшего за ним стопового ордера. Все ордера (их может быть
несколько, поэтому ввести в меню ограничение по колличеству) закрываются по достижению суммарного профита в валюте.
В меню должно быть:

— расстояние между ордерами (около 30)
— тейк профит первого ордера
— уровень суммарного профита для закрытия ордеров
— лот1 — 0.01
— лот2 — 0.02
— лот3 — 0.03
— лот4 — 0.06
— лот5 — 0.12
— лот6 — 0.24
— лот7 — 0.48
— лот8 — 0.96
— лот9 — 1.92
— лот10- 3.84
— колличество открытых ордеров ( хотя может это лишнее)
— проскальзывание цены
— магическое число

картинка для пояснения: shot.qip.ru/00GmGP-6Ogbqip2b/
  • +3
  • Просмотров: 11393
  • 5 октября 2015, 22:47
  • vikas
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Советник по индикатору BBands_Stop_v1
Следующая запись в группе  
Советник по времени 2
05 октября 2015
06 октября 2015

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

+
0
Cейчас начну делать.
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 6 октября 2015, 10:47
+
0
Советник сложный, много всего в ТЗ наворочено.
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 6 октября 2015, 11:37
+
0
Реализована где то треть ТЗ. Смотрите и дальше можно постепенно добавлять следующие пункты.


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

//--- Inputs
extern int    StopLoss       = 300;       // лось 
extern int    TakeProfit     = 500;       // язь
extern int    Delta          = 200;       // символ
extern double Profit         = 100;       // профит в валюте
extern double Lots           = 0.1;       // лот
extern int    Slip           = 30;        // проскальзывание
extern int    Count          = 1;         // количество открываемых ордеров
extern int    Magic          = 123;       // магик

double Lot[10]={0.01,0.02,0.03,0.06,0.12,0.24,0.48,0.96,1.92,3.84};
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
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()==OP_BUY || OrderType()==OP_SELL)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+  
void CloseAll()
  {
   bool cl=true;
   double pBid,pAsk;

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            pBid=MarketInfo(OrderSymbol(),MODE_BID);
            pAsk=MarketInfo(OrderSymbol(),MODE_ASK);
            if(OrderType()==OP_BUY) cl=OrderClose(OrderTicket(),OrderLots(),fND(pBid),Slip,Blue);
            if(OrderType()==OP_SELL) cl=OrderClose(OrderTicket(),OrderLots(),fND(pAsk),Slip,Red);
           }
        }
     }
  }
//+------------------------------------------------------------------+
double fND(double d,int n=-1)
  {
   if(n<0) return(NormalizeDouble(d, Digits));
   return(NormalizeDouble(d, n));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double AllProfit()
  {
   double profit=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      bool sel=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
         if(OrderType()==OP_BUY || OrderType()==OP_SELL) profit+=OrderProfit();
     }
   return(profit);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
        {
         if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
           {
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
            if(OrderType()==OP_BUYSTOP)  del=OrderDelete(OrderTicket());
            if(OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int LastDealResult()
  {
   int result=0;
   if(OrdersHistoryTotal()==0)
     {
      result=0;
     }
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderProfit()>0)
        {
         result=1;//tp  
        }
      if(OrderProfit()<0)
        {
         result=2;//sl  
        }
     }
   return(result);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
// торгуем
   int res=0,i=0;
   double sl=0,tp=0,bid=0,ask=0,pr=0;
   
   i=CountTrades();
//---- buy 
   if(Open[1]<Close[1] && Open[0]>Close[1] && CountTrades()<Count)
     {
      bid=MarketInfo(Symbol(),MODE_BID);
      ask=MarketInfo(Symbol(),MODE_ASK);
      sl=NormalizeDouble(ask-StopLoss*Point,Digits);
      tp=NormalizeDouble(ask+TakeProfit*Point,Digits);
      res=OrderSend(Symbol(),OP_BUY,Lot[i],NormalizeDouble(ask,Digits),Slip,sl,tp,"",Magic,0,Blue);

      pr=ask-Delta*Point;
      sl=NormalizeDouble(pr+StopLoss*Point,Digits);
      tp=NormalizeDouble(pr-TakeProfit*Point,Digits);
      res=OrderSend(Symbol(),OP_SELLSTOP,Lot[i],NormalizeDouble(pr,Digits),Slip,sl,tp,"",Magic,0,Red);
      return;
     }

//---- sell   
   if(Open[1]>Close[1] && Open[0]<Close[1] && CountTrades()<Count)
     {
      bid=MarketInfo(Symbol(),MODE_BID);
      ask=MarketInfo(Symbol(),MODE_ASK);
      sl=NormalizeDouble(bid+StopLoss*Point,Digits);
      tp=NormalizeDouble(bid-TakeProfit*Point,Digits);
      res=OrderSend(Symbol(),OP_SELL,Lot[i],NormalizeDouble(bid,Digits),Slip,sl,tp,"",Magic,0,Red);

      pr=bid+Delta*Point;
      sl=NormalizeDouble(pr-StopLoss*Point,Digits);
      tp=NormalizeDouble(pr+TakeProfit*Point,Digits);
      res=OrderSend(Symbol(),OP_BUYSTOP,Lot[i],NormalizeDouble(pr,Digits),Slip,sl,tp,"",Magic,0,Blue);
      return;
     }

   if(CountTrades()>1)
     {

     }

   if(LastDealResult()==1)DelOrder();
   if(AllProfit()>=Profit) CloseAll();
   Comment("\n Profit: ",AllProfit());
  }
//+------------------------------------------------------------------+

avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 6 октября 2015, 11:56
+
0
да, хорошо. я тогда вечером посмотрю и отпишусь.
А то я не у компьютера.
avatar

  9  vikas Автор Сообщений: 113 - Алексей

  • 6 октября 2015, 12:15
+
+1
Сейчас реализовано 2/3 ТЗ. До вечера.
www.opentraders.ru/downloads/890/


avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 6 октября 2015, 12:58
+
0
Добрался до компа.
Так, нет как то всё не так. Давай с самого начала.
Сов начинает работу — открывается предположим buy. У него выставляется тейк профит.
Одновременно с этим выставляется sellstop(на величину дельта указанную в меню).
К примеру, цена до ТП не дошла, развернулась и пошла вниз. Сработал sellstop-
т.е. открылся sell. Сразу же выставляется buystop. Выставляется он на том же уровне что и первый ордер buy. Затем цена гуляет туда сюда и идёт вверх — сра-
батывает buystop, тут же выставляется sellstop (на том же уровне, что и предыдущий открытый ордер sell, дальше цена погуляла вверх, недобрала суммарного
профита и пошла круто вниз — сработал sellstop, естественно выставился buystop,
(у нас уже открыто 4 ордера, суммарный объём sell превышает суммарный объём buy)
но цена продолжила движение вниз, и как только суммарный профит достиг уровня указанного в меню т.е. как только профит ордеров sell превысил просадку ордеров
buy, советник закрывает все эти ордера.
Не должно быть никаких стоплосов. Тейк профит только у первоначального ордера и
удаляется если цена пошла в другую сторону и сработал стоповый ордер.
Посмотри пожалуйста картинку shot.qip.ru/00GmGP-3Ogbqip3K/
Все ордера buy по одной цене и все sell по одной цене, между ними дельта
лот каждого последующего открываемого ордера должен повышаться как в ТЗ
Редактирован: 6 октября 2015, 19:39
avatar

  9  vikas Автор Сообщений: 113 - Алексей

  • 6 октября 2015, 19:19
+
0
Ваш уже завтра смотреть буду.
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 6 октября 2015, 22:38
+
0
Хорошо. Там у первоначального ордера не убирается ТП когда срабатывает стоповый ордер.
avatar

  9  vikas Автор Сообщений: 113 - Алексей

  • 6 октября 2015, 22:53
+
0
Здорово! Я видел такие системы но не думал, что это так реализуется.
www.opentraders.ru/downloads/890/

avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 7 октября 2015, 00:37
+
0
У меня не получаются такие показатели, стремящиеся строго на север. *wall* 
Входящие параметры не меняла, тестировала евро с июля по октябрь 2015. Ушло на юг *pardon* 
avatar

  27  Oxy Сообщений: 3418 - ..ιllιlι.lι.ιllι.ιlι..

  • 7 октября 2015, 01:23
+
0
У меня не получаются такие показатели, стремящиеся строго на север.  
Входящие параметры не меняла, тестировала евро с июля по октябрь 2015. Ушло на юг


Входные параметры по умолчанию, стоят левые. Ставила на оптимизацию?

avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 7 октября 2015, 10:41
+
0
www.mql5.com/ru/market/product/11420
Это то самое.


Тогда чем не устраивает, советник с мкл? Если бы вы мне сразу дали ссылку на советник, мне это облегчило бы работу в разы.
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 7 октября 2015, 10:46
+
0
Андрей, доброе утро. У тебя наверное ТП задран под 500. Да, тогда все ордера
закрываются по суммарному профиту. Но если ТП первого ордера поставить 20
(каким он и должен быть) то ты увидишь, что ТП почемуто у всех ордеров. А он
должен быть только у первоначального ордера. Вот посмотри ССылку
www.mql5.com/ru/market/product/11420
Это то самое. Только у него закрываются по определённому колличеству пунктов
указанных в меню. А это я считаю не совсем правильно. Надо в валюте. Да с
йеной почемуто не работает. А так идёт на север.

Всё, убегаю на работу. Буду только поздно вечером.
Скачай, прогони на визуализации на Eurusd H1
avatar

  9  vikas Автор Сообщений: 113 - Алексей

  • 7 октября 2015, 07:10
+
0
Да, каюсь, надо было так и сделать. Понадеялся что хватит
обьяснения. Насчет этого советника. нужно чтобы закрытие было
в валюте. во вторых он не работает с йеной -что то с запятой.
третье хотелось иметь возможность редактирования кода.
avatar

  9  vikas Автор Сообщений: 113 - Алексей

  • 7 октября 2015, 11:39
+
0
В версии без стопов, появляются надолго зависшие ордера. Со стопами работает стабильнее. Сейчас есть только тейк у первых ордеров.



<code>
//+------------------------------------------------------------------+
//|                                                  HedgeMartin.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern int    StopLoss       = 300;       // лось 
extern int    TakeProfit     = 500;       // язь
extern int    Delta          = 200;       // дельта
extern double Profit         = 100;       // профит в валюте
extern double Lots           = 0.1;       // лот
extern int    Slip           = 30;        // проскальзывание
extern int    Count          = 1;         // количество открываемых ордеров
extern int    Magic          = 123;       // магик

double Lot[10]={0.01,0.02,0.03,0.06,0.12,0.24,0.48,0.96,1.92,3.84};
double BuyStopPrice=0, SellStopPrice=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
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()==OP_BUY || OrderType()==OP_SELL)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+  
int LastOrderType()
  {
   int type=0;
   if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderType()==OP_BUY)  type=1; //sell
         if(OrderType()==OP_SELL) type=2; //buy
        }
     }
   return(type);
  }
//+------------------------------------------------------------------+  
void CloseAll()
  {
   bool cl=true;
   double pBid,pAsk;

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            pBid=MarketInfo(OrderSymbol(),MODE_BID);
            pAsk=MarketInfo(OrderSymbol(),MODE_ASK);
            if(OrderType()==OP_BUY) cl=OrderClose(OrderTicket(),OrderLots(),fND(pBid),Slip,Blue);
            if(OrderType()==OP_SELL) cl=OrderClose(OrderTicket(),OrderLots(),fND(pAsk),Slip,Red);
           }
        }
     }
  }
//+------------------------------------------------------------------+
double fND(double d,int n=-1)
  {
   if(n<0) return(NormalizeDouble(d, Digits));
   return(NormalizeDouble(d, n));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double AllProfit()
  {
   double profit=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      bool sel=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
         if(OrderType()==OP_BUY || OrderType()==OP_SELL) profit+=OrderProfit();
     }
   return(profit);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
        {
         if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
           {
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
            if(OrderType()==OP_BUYSTOP)  del=OrderDelete(OrderTicket());
            if(OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int LastDealResult()
  {
   int result=0;
   if(OrdersHistoryTotal()==0)
     {
      result=0;
     }
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderProfit()>0)
        {
         result=1;//tp  
        }
      if(OrderProfit()<0)
        {
         result=2;//sl  
        }
     }
   return(result);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
// торгуем
   int res=0,i=0;
   double tp=0,bid=0,ask=0,pr=0;

   bid=MarketInfo(Symbol(),MODE_BID);
   ask=MarketInfo(Symbol(),MODE_ASK);

   i=CountTrades();
// открытие первого ордера по условию
   if(CountTrades()<1)
     {
      //---- buy 
      if(Open[1]<Close[1] && Open[0]>Close[1])
        {
         tp=NormalizeDouble(ask+TakeProfit*Point,Digits);
         res=OrderSend(Symbol(),OP_BUY,Lot[i],NormalizeDouble(ask,Digits),Slip,0,tp,"",Magic,0,Blue);
         BuyStopPrice=ask;
         SellStopPrice=ask-Delta*Point;
         i++;
         return;
        }

      //---- sell   
      if(Open[1]>Close[1] && Open[0]<Close[1])
        {
         tp=NormalizeDouble(bid-TakeProfit*Point,Digits);
         res=OrderSend(Symbol(),OP_SELL,Lot[i],NormalizeDouble(bid,Digits),Slip,0,tp,"",Magic,0,Red);
         SellStopPrice=bid;
         BuyStopPrice=pr=bid+Delta*Point;         
         i++;
         return;
        }
     }

// открытие последующих ордеров
   if(CountTrades()>0)
     {
      if(LastOrderType()==1)
        {
         pr=SellStopPrice;
         res=OrderSend(Symbol(),OP_SELLSTOP,Lot[i],NormalizeDouble(pr,Digits),Slip,0,0,"",Magic,0,Red);
         i++;
         return;
        }

      if(LastOrderType()==2)
        {
         pr=BuyStopPrice;
         res=OrderSend(Symbol(),OP_BUYSTOP,Lot[i],NormalizeDouble(pr,Digits),Slip,0,0,"",Magic,0,Blue);
         i++;
         return;
        }
     }

   if(LastDealResult()==1)DelOrder();
   if(AllProfit()>=Profit) {CloseAll();DelOrder();}
   
   Comment("\n Profit: ",AllProfit(),
           "\n Last Order Type: ",LastOrderType());
  }
//+------------------------------------------------------------------+

</code>

Редактирован: 7 октября 2015, 12:28
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 7 октября 2015, 12:25
+
0
хорошо, пусть стопы останутся, я ними разберусь. Но всётаки тейк профит
должен быть только у первоначального ордера и удаляться если сработал
отложенник. А дальше все должно закрыться по суммарному профиту в валюте. Ты же ведь смотрел наверное работу советника.
(закроется не закроется — другой вопрос. Но логика должна быть такая)
Иначе нарушается стратегия. Конечно многое зависит от того, какой я
выставлю суммарный профит в меню. Тут есть свои тонкости. Надо вводить коэффициент по уровню суммарного профита после срабатывании очередного
отложенника. Но это уже другая история. Я лишь прошу повторить алгоритм
того советника.
avatar

  9  vikas Автор Сообщений: 113 - Алексей

  • 7 октября 2015, 13:24
+
0
Советник с мкл у меня не запускается в тестере. А поставить нолики вместо стопов, надеюсь сможете самостоятельно. Если есть еще вопросы по логике работы советника, пожалуйста.
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 7 октября 2015, 13:28
+
0
в меню советника в первой строке измени мануал на работу по индикатору.
По йене — дело не в ноликах. Когда я ставлю дельту 30, советник устанавливает её 3000. Я бы рад поставить в меню 0.3, так не даёт.
avatar

  9  vikas Автор Сообщений: 113 - Алексей

  • 7 октября 2015, 13:35
+
0
А, с ноликами то это про стопы а я тут про йену. Туплю.
avatar

  9  vikas Автор Сообщений: 113 - Алексей

  • 7 октября 2015, 13:42
+
0
Вы писали что собираетесь редактировать код. Значит вы разбираетесь в мкл.
третье хотелось иметь возможность редактирования кода.


Неужели пункт с дельтой и условием вызывает у вас затруднения?

По йене — дело не в ноликах. Когда я ставлю дельту 30, советник устанавливает её 3000. Я бы рад поставить в меню 0.3, так не даёт.


Дельта в настройках. Нужно всего лишь поменять инт на дабл.

extern int Delta = 200; // дельта


А для входов вызвать индикатор и прописать условие.
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 7 октября 2015, 13:45
+
0
Да я имел ввиду советник который по ссылке. А там только exe файл.

Редактирован: 7 октября 2015, 14:00
avatar

  9  vikas Автор Сообщений: 113 - Алексей

  • 7 октября 2015, 13:49
+
0
Если уж у вас вызывает все это затруднение, сейчас добавлю отключаемые стопы ко всем ордерам и дельту дабл.

в меню советника в первой строке измени мануал на работу по индикатору.


Какой индикатор?
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 7 октября 2015, 16:10
+
0
Сделал все стопы отключаемыми и дабл дельту.


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

//--- Inputs ---        Если 0-нет стопа
extern int    StopLoss       = 300;       // лось для рыночного ордера
extern int    TakeProfit     = 500;       // язь для рыночного ордера
extern int    SStopLoss      = 300;       // лось для отложенного ордера
extern int    STakeProfit    = 500;       // язь для отложенного ордера
extern double Delta          = 200;       // дельта
extern double Profit         = 100;       // профит в валюте
extern int    Slip           = 30;        // проскальзывание для рыночного ордера
extern int    Sslip          = 0;         // проскальзывание для отложенного ордера
extern int    Count          = 1;         // количество открываемых ордеров
extern int    Magic          = 123;       // магик

double Lot[10]={0.01,0.02,0.03,0.06,0.12,0.24,0.48,0.96,1.92,3.84};
double BuyStopPrice=0, SellStopPrice=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
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()==OP_BUY || OrderType()==OP_SELL)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+  
int LastOrderType()
  {
   int type=0;
   if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderType()==OP_BUY)  type=1; //sell
         if(OrderType()==OP_SELL) type=2; //buy
        }
     }
   return(type);
  }
//+------------------------------------------------------------------+  
void CloseAll()
  {
   bool cl=true;
   double pBid,pAsk;

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            pBid=MarketInfo(OrderSymbol(),MODE_BID);
            pAsk=MarketInfo(OrderSymbol(),MODE_ASK);
            if(OrderType()==OP_BUY) cl=OrderClose(OrderTicket(),OrderLots(),fND(pBid),Slip,Blue);
            if(OrderType()==OP_SELL) cl=OrderClose(OrderTicket(),OrderLots(),fND(pAsk),Slip,Red);
           }
        }
     }
  }
//+------------------------------------------------------------------+
double fND(double d,int n=-1)
  {
   if(n<0) return(NormalizeDouble(d, Digits));
   return(NormalizeDouble(d, n));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double AllProfit()
  {
   double profit=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      bool sel=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
         if(OrderType()==OP_BUY || OrderType()==OP_SELL) profit+=OrderProfit();
     }
   return(profit);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
        {
         if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
           {
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
            if(OrderType()==OP_BUYSTOP)  del=OrderDelete(OrderTicket());
            if(OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int LastDealResult()
  {
   int result=0;
   if(OrdersHistoryTotal()==0)
     {
      result=0;
     }
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderProfit()>0)
        {
         result=1;//tp  
        }
      if(OrderProfit()<0)
        {
         result=2;//sl  
        }
     }
   return(result);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
// торгуем
   int res=0,i=0;
   double sl=0,tp=0,bid=0,ask=0,pr=0;

   bid=MarketInfo(Symbol(),MODE_BID);
   ask=MarketInfo(Symbol(),MODE_ASK);

   i=CountTrades();
// открытие первого ордера по условию
   if(CountTrades()<1)
     {
      //---- buy 
      if(Open[1]<Close[1] && Open[0]>Close[1])
        {
         if(StopLoss>0) sl=NormalizeDouble(ask-StopLoss*Point,Digits); else sl=0;
         if(TakeProfit>0) tp=NormalizeDouble(ask+TakeProfit*Point,Digits);  else tp=0;
         res=OrderSend(Symbol(),OP_BUY,Lot[i],NormalizeDouble(ask,Digits),Slip,sl,tp,"",Magic,0,Blue);
         BuyStopPrice=ask;
         SellStopPrice=ask-Delta*Point;
         i++;
         return;
        }

      //---- sell   
      if(Open[1]>Close[1] && Open[0]<Close[1])
        {
         if(StopLoss>0) sl=NormalizeDouble(bid+StopLoss*Point,Digits); else sl=0;
         if(TakeProfit>0) tp=NormalizeDouble(bid-TakeProfit*Point,Digits);  else tp=0;
         res=OrderSend(Symbol(),OP_SELL,Lot[i],NormalizeDouble(bid,Digits),Slip,sl,tp,"",Magic,0,Red);
         SellStopPrice=bid;
         BuyStopPrice=pr=bid+Delta*Point;         
         i++;
         return;
        }
     }

// открытие последующих ордеров
   if(CountTrades()>0)
     {
      if(LastOrderType()==1)
        {
         pr=SellStopPrice;
         if(SStopLoss>0) sl=NormalizeDouble(pr+SStopLoss*Point,Digits); else sl=0;
         if(STakeProfit>0) tp=NormalizeDouble(pr-STakeProfit*Point,Digits);  else tp=0;
         res=OrderSend(Symbol(),OP_SELLSTOP,Lot[i],NormalizeDouble(pr,Digits),Sslip,sl,tp,"",Magic,0,Red);
         i++;
         return;
        }

      if(LastOrderType()==2)
        {
         pr=BuyStopPrice;
         if(SStopLoss>0) sl=NormalizeDouble(pr-SStopLoss*Point,Digits); else sl=0;
         if(STakeProfit>0) tp=NormalizeDouble(pr+STakeProfit*Point,Digits);  else tp=0;
         res=OrderSend(Symbol(),OP_BUYSTOP,Lot[i],NormalizeDouble(pr,Digits),Sslip,sl,tp,"",Magic,0,Blue);
         i++;
         return;
        }
     }

   if(LastDealResult()==1)DelOrder();
   if(AllProfit()>=Profit) {CloseAll();DelOrder();}
   
   Comment("\n Profit: ",AllProfit(),
           "\n Last Order Type: ",LastOrderType());
  }
//+------------------------------------------------------------------+

avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 7 октября 2015, 16:28
+
0
Андрей, наверное я плохо объясняю. Такое ощущение что мы общаемся через переводчика. Но всётаки, тейк профит должен быть только у первоначального ордера и удаляться если сработал следующий за ним отложенник. А дальше все должно закрыться по суммарному профиту в валюте. Больше ничего делать не надо.
Вот посмотри на картинку shot.qip.ru/00GmGP-5Ogbqip5F/
Это последняя твоя версия. Всё замечательно. Только первый рыночный ордер BUY
закрылся по своему ТП уже после того как сработали отложенники. А нужно было
чтобы ТП этого первого ордера удалился после сработки sellstop и чтобы этот первый BUY закрылся вместе со всеми.

avatar

  9  vikas Автор Сообщений: 113 - Алексей

  • 7 октября 2015, 23:10
+
0
Андрей, наверное я плохо объясняю. Такое ощущение что мы общаемся через переводчика. Но всётаки, тейк профит должен быть только у первоначального ордера и удаляться если сработал следующий за ним отложенник.


Хорошо. Там у первоначального ордера не убирается ТП когда срабатывает стоповый ордер.


Вы определитесь пожалуйста.
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 7 октября 2015, 23:20
+
0
Ну так да. Выставился BUY. У него выставился ТП. Одновременно выставился Sellstop.
Здесь нормально. Дальше цена пошла вниз сработал Sellstop. ТП ордера Buy должен
удалиться. А он не удаляется. Что не так?
avatar

  9  vikas Автор Сообщений: 113 - Алексей

  • 7 октября 2015, 23:44
+
0
Я вот давал тебе ссылку на советника с сайта mql5. Ты говоришь он у тебя в тестере не запускается. Там просто в меню в первой строчке надо надо поменять «manual»
на «by indicator». Тогда он тестится. (если тебе это ещё интересно)
avatar

  9  vikas Автор Сообщений: 113 - Алексей

  • 8 октября 2015, 00:04
+
0
vikas, реально интересный советник

Думаете, он будет лучше работать, если закрытие в валюте, а не в пунктах?
avatar

  27  Oxy Сообщений: 3418 - ..ιllιlι.lι.ιllι.ιlι..

  • 8 октября 2015, 04:58
+
0
Странно как то, вы же когда то делали мне похожий советник и вас тогда не заинтересовало.

В базе уже есть похожий советник с разными модификациями. Извините программисты что не сказал, думал будет что то новое.
avatar

  14  beton2011 Сообщений: 895

  • 8 октября 2015, 09:20
+
0
beton2011, ваша идея не дала такого графика, стремящегося на север
avatar

  27  Oxy Сообщений: 3418 - ..ιllιlι.lι.ιllι.ιlι..

  • 8 октября 2015, 15:10
+
0
Oxy, доброе утро. Честно, не знаю. Но попробовать надо. Дело в том что во флете
он иногда открывает очень много ордеров. Очень здорово растёт маржа. По пунктам
он не доходит до закрытия. А вот в валюте мог бы. Ну и вообще я хотел поиграться
с кодом — изменить например условия открытия ордера, ввести какие нибудь коэффициенты, фильтры и т.д. Я уже так делал в предыдущих ваших с Андреем советниках.
avatar

  9  vikas Автор Сообщений: 113 - Алексей

  • 8 октября 2015, 06:44
+
0
Много ордеров, это большой минус этого советника.
Одно из решений — более точные сигналы для входа.
avatar

  27  Oxy Сообщений: 3418 - ..ιllιlι.lι.ιllι.ιlι..

  • 8 октября 2015, 15:13
+
0
Вот это условие не срабатывает чтобы я ни пытался:

if(CountTrades()==2)


Так работает удаляет тейк:
if(DelTP==1) DellTP();


А так ни в какую:


   if(CountTrades()==2)
     {
      if(DelTP==1) DellTP();
     }


Смотрите может у вас получится:


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

//--- Inputs
extern int    StopLoss       = 300;       // лось 
extern int    TakeProfit     = 500;       // язь
extern int    Delta          = 200;       // дельта
extern int    DelTP          = 1;         // 0-тейк не убирается 1-убирается
extern double Profit         = 100;       // профит в валюте
extern double Lots           = 0.1;       // лот
extern int    Slip           = 30;        // проскальзывание
extern int    Count          = 1;         // количество открываемых ордеров
extern int    Magic          = 123;       // магик

double Lot[10]={0.01,0.02,0.03,0.06,0.12,0.24,0.48,0.96,1.92,3.84};
double BuyStopPrice=0,SellStopPrice=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
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()==OP_BUY || OrderType()==OP_SELL)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+  
int LastOrderType()
  {
   int type=0;
   if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderType()==OP_BUY)  type=1; //sell
         if(OrderType()==OP_SELL) type=2; //buy
        }
     }
   return(type);
  }
//+------------------------------------------------------------------+  
void CloseAll()
  {
   bool cl=true;
   double pBid,pAsk;

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            pBid=MarketInfo(OrderSymbol(),MODE_BID);
            pAsk=MarketInfo(OrderSymbol(),MODE_ASK);
            if(OrderType()==OP_BUY) cl=OrderClose(OrderTicket(),OrderLots(),fND(pBid),Slip,Blue);
            if(OrderType()==OP_SELL) cl=OrderClose(OrderTicket(),OrderLots(),fND(pAsk),Slip,Red);
           }
        }
     }
  }
//+------------------------------------------------------------------+
double fND(double d,int n=-1)
  {
   if(n<0) return(NormalizeDouble(d, Digits));
   return(NormalizeDouble(d, n));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double AllProfit()
  {
   double profit=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      bool sel=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
         if(OrderType()==OP_BUY || OrderType()==OP_SELL) profit+=OrderProfit();
     }
   return(profit);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
        {
         if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
           {
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
            if(OrderType()==OP_BUYSTOP)  del=OrderDelete(OrderTicket());
            if(OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int LastDealResult()
  {
   int result=0;
   if(OrdersHistoryTotal()==0)
     {
      result=0;
     }
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderProfit()>0)
        {
         result=1;//tp  
        }
      if(OrderProfit()<0)
        {
         result=2;//sl  
        }
     }
   return(result);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DellTP()
  {
   bool mod;
   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)
              {
               if(OrderTakeProfit()>0) mod=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,0,Yellow);
               return;
              }
            if(OrderType()==OP_SELL)
              {
               if(OrderTakeProfit()>0) mod=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,0,Yellow);
               return;
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
// торгуем
   int res=0,i=0;
   double tp=0,bid=0,ask=0,pr=0;

   bid=MarketInfo(Symbol(),MODE_BID);
   ask=MarketInfo(Symbol(),MODE_ASK);

   i=CountTrades();
// открытие первого ордера по условию
   if(CountTrades()<1)
     {
      //---- buy 
      if(Open[1]<Close[1] && Open[0]>Close[1])
        {
         tp=NormalizeDouble(ask+TakeProfit*Point,Digits);
         res=OrderSend(Symbol(),OP_BUY,Lot[i],NormalizeDouble(ask,Digits),Slip,0,tp,"",Magic,0,Blue);
         BuyStopPrice=ask;
         SellStopPrice=ask-Delta*Point;
         i++;
         return;
        }

      //---- sell   
      if(Open[1]>Close[1] && Open[0]<Close[1])
        {
         tp=NormalizeDouble(bid-TakeProfit*Point,Digits);
         res=OrderSend(Symbol(),OP_SELL,Lot[i],NormalizeDouble(bid,Digits),Slip,0,tp,"",Magic,0,Red);
         SellStopPrice=bid;
         BuyStopPrice=pr=bid+Delta*Point;
         i++;
         return;
        }
     }

// открытие последующих ордеров
   if(CountTrades()>0)
     {
      if(LastOrderType()==1)
        {
         pr=SellStopPrice;
         res=OrderSend(Symbol(),OP_SELLSTOP,Lot[i],NormalizeDouble(pr,Digits),Slip,0,0,"",Magic,0,Red);
         i++;
         return;
        }

      if(LastOrderType()==2)
        {
         pr=BuyStopPrice;
         res=OrderSend(Symbol(),OP_BUYSTOP,Lot[i],NormalizeDouble(pr,Digits),Slip,0,0,"",Magic,0,Blue);
         i++;
         return;
        }
     }
     
   if(CountTrades()==2)
     {
      if(DelTP==1) DellTP();
     }
     
   if(LastDealResult()==1)DelOrder();
   if(AllProfit()>=Profit) {CloseAll();DelOrder();}


   Comment("\n Profit: ",AllProfit(),
           "\n Last Order Type: ",LastOrderType(),
           "\n Count Trades: ",CountTrades());
  }
//+------------------------------------------------------------------+

avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 8 октября 2015, 11:09
+
0
хорошо я конечно буду пробовать.
Тогда может его не удалять а загнать
куда подальше. А в меню указать куда?
главное ведь что бы он не мешал.
Все равно ведь закрытие то в валюте?
Короче модифицировать?
avatar

  9  vikas Автор Сообщений: 113 - Алексей

  • 8 октября 2015, 11:26
+
0
Можно поставить 0 или сделать побольше пунктов.
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 8 октября 2015, 12:25
+
0
Андрей это ты что имел ввиду? Поставить сразу в меню?
Или в процессе модификации?
Если первое то не подходит.
Если второе то я об этом и говорил.
avatar

  9  vikas Автор Сообщений: 113 - Алексей

  • 8 октября 2015, 12:48
+
0
Андрей, посмотрел последнюю версию. Давай закончим на этом. Тебе большое
спасибо за упорство и терпение. Дальше я сам.
avatar

  9  vikas Автор Сообщений: 113 - Алексей

  • 8 октября 2015, 17:47
+
0
Проблема решена.
avatar

  9  vikas Автор Сообщений: 113 - Алексей

  • 8 октября 2015, 20:29
+
0
и как решили?, можно поинтересоватся *pardon* 
Редактирован: 17 октября 2015, 04:40
avatar

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

  • 17 октября 2015, 04:39
+
0
изменил блок void DellTP() на:
void ModifyOrders() {
  int tip,Ticket;
   double SL=0,TP=0;
   double OOP;
  
   for (int i=0; i<OrdersTotal(); i++) 
   {  
      if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
      {  
         tip = OrderType();
         if (OrderSymbol()==Symb && OrderMagicNumber()==Magic && (OrderType()==OP_BUY || OrderType()==OP_SELL))
         {
            
            
            {  
               OOP   = OrderOpenPrice();
               Ticket = OrderTicket();
                
               if (tip==OP_BUY)             
               {
                  if (STakeProfit!=0) TP = NormalizeDouble(OOP + STakeProfit*Point,Digits); 
                  if (SStopLoss!=0)   SL = NormalizeDouble(OOP - SStopLoss*Point,Digits);  
                    
                  if(OrderTakeProfit()!=TP)  int number =OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0,Yellow);
                 
               }  
                                                       
               if (tip==OP_SELL)        
               {
                  if (STakeProfit!=0) TP = NormalizeDouble(OOP - STakeProfit*Point,Digits); 
                  if (SStopLoss!=0)   SL = NormalizeDouble(OOP + SStopLoss*Point,Digits);
                  
                  if(OrderTakeProfit()!=TP)  int number1 =OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0,Yellow);              
                  
                  
               } 
            }
         }
      }
      
   }

}
avatar

  9  vikas Автор Сообщений: 113 - Алексей

  • 20 октября 2015, 22:34
+
0
Обманула систему :D 
Научилась делать графики, смотрящие строго на север.
Осталось выровнять кривую баланса.
avatar

  27  Oxy Сообщений: 3418 - ..ιllιlι.lι.ιllι.ιlι..

  • 8 октября 2015, 23:20
+
+1
Шпильки пускаешь? :D 
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 9 октября 2015, 14:26
+
0
доработанный по золоту за 2 года shot.qip.ru/00GmGP-5Ogbqip64/
avatar

  9  vikas Автор Сообщений: 113 - Алексей

  • 9 октября 2015, 06:54
+
0
Советник класный делает прибыль, но не срабатывают на некоторых парах отложки и получается прибыль есть но маленькая. Пожалуста посмотрите почему не выставляются ордера.



Вот советник

yadi.sk/d/42dCUGHJpPpKE
avatar

  15  cashyra Сообщений: 392 - Юра

  • 24 февраля 2016, 10:23
+
0
Пожалуста посмотрите почему не выставляются ордера.

Нужно ставить на отладку, а это трейдерам от 3-го уровня после создания топика с столе заказов.
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 24 февраля 2016, 20:30

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