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


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


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

AM2

  • 7 октября 2015, 23:20
0
Завтра буду смотреть.
avatar

AM2

  • 7 октября 2015, 22:26
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

AM2

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

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


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

AM2

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


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

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


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

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


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

AM2

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

AM2

  • 7 октября 2015, 13:28
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>
avatar

AM2

  • 7 октября 2015, 12:25
+1
Сделал обнуление противоположного таймера, при смене профита.
www.opentraders.ru/downloads/891/
avatar

AM2

  • 7 октября 2015, 12:08
0
Я сейчас пытаюсь сделать обнуление таймера при смене значения профита. Событие OnTimer в тестере не обрабатывается, поэтому по истории прогнать не получится.
avatar

AM2

  • 7 октября 2015, 12:03
0
Я понимаю что это непросто, но форекс это тоже непростая штука  


Мне очень не нравится когда начинают издеваться!
avatar

AM2

  • 7 октября 2015, 11:33
0
Не надо особо мучится с остановкой таймера на противоположном сигнале.

Этот момент уже есть по умолчанию.
avatar

AM2

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


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

AM2

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


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

avatar

AM2

  • 7 октября 2015, 10:41
0
У меня почему то не работают таймеры,
Это мне ни о чем не говорит. Нужно смотреть логи.
avatar

AM2

  • 7 октября 2015, 10:27
0
Посмотри таблицу оптимизации в топике.
avatar

AM2

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

avatar

AM2

  • 7 октября 2015, 00:37
0
Я так понимаю советник был сделан под историю


А вы сделайте оптимизацию на определенном участке истории и посмотрите результат на форвард и бэкворд периоде.
avatar

AM2

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

AM2

  • 6 октября 2015, 22:38
0
Сделал все кроме обнуления противоположного таймера: www.opentraders.ru/downloads/891/

avatar

AM2

  • 6 октября 2015, 22:28
0
Сделал простейший советник. Считает секунды профита и минуса ордера.


//+------------------------------------------------------------------+
//|                                                        Timer.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

int l=0,p=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double AllProfit()
  {
   double profit=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) profit+=OrderProfit();
           }
        }
     }
   return(profit);
  }  
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(AllProfit()<0)l++;
   if(AllProfit()>0)p++;
   Comment("\n Лосс Таймер ",l," sec",
           "\n Профит Таймер ",p," sec",
           "\n Профит ",AllProfit());
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 6 октября 2015, 21:57