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

Рейтинг 2089



РЕКОМЕНДУЮ




Лучшее от div15



может все просто Комментариев 7
2012-03-22 17:38:38Рейтинг 0

переделка советника

Здравствуйте, Уважаемый АМ2! Могли бы Вы написать советник по
стратегии пробоя предидущей свечи: сигналы Open[1]<Close[1] && Open[0]>Close[1] покупка
Open[1]>Close[1] && Open[0]<Close[1] продажа
выставляет один рыночный один стоповый ордер на бай и сел, на мин.и макс.
предидущей свечи с отступом от них сколько я задам. Пример:
Когда открывается бай но идет в против. тогда срабатывает
открытие в сел в 2 раза больше начального лота и одновременно на
первоначальном бае выставляется снова ордер в 2 раза больше села,
если и сел начинает против идти, тогда срабатывает снова в бай который
был выставлен и т.д. Как бы цена бьется в канале, но стратегия на пробой,
ордера будут открываться по ходу движения. Поэтому получается первый ордер
если допустим в бай первоначальным лотом, второй в сел значит в 2 раза больше
и последующие, в бай, в сел, в бай, в сел… В два раза больше от пред идущего.
стоплосс при потери связи с брокером прикрутить надо
реверс закрытие ордеров при встречном сигнале
примерные параметры

extern int Delta = 100; // дельта
extern int stoploss = 0; // стоплосс
extern int takeprofit = 0; // тейкпрофит
extern double Lots = 0.01; // лот
extern double KLot = 2; // увеличение лота
extern double MaxLot = 10; // максимальный лот
extern int Slip = 30; // проскальзывание
extern bool CloseRevers = true; // закрывать ордера при встречном сигнале
extern int Magic = 321; // магик

или переделать этот советник
//+------------------------------------------------------------------+
//|                                                  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    Delta          = 100;       // дельта
extern double Loss           = 9000;      // убыток в валюте
extern double Profit         = 10;        // профит в валюте
extern double Lots           = 0.01;      // лот
extern double KLot           = 2;         // увеличение лота
extern double MaxLot         = 10;        // максимальный лот
extern int    Slip           = 30;        // проскальзывание
extern int    Magic          = 123;       // магик

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--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) profit+=OrderProfit()+OrderSwap()+OrderCommission();
           }
        }
     }
   return(profit);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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()==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(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderProfit()>0)
           {
            result=1;//tp  
           }
         if(OrderProfit()<0)
           {
            result=2;//sl  
           }
        }
     }
   return(result);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;
   if(CountTrades()>0) lot=NormalizeDouble(Lots*MathPow(KLot,CountTrades()),2);
   if(lot>MaxLot)lot=Lots;
   return(lot);
  }  
//+------------------------------------------------------------------+
//| 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);

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

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

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

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

   if(LastDealResult()==1)DelOrder();
   if(AllProfit()>=Profit || AllProfit()<=-Loss)
     {
      CloseAll();
      DelOrder();
     }

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

  • 0
  • Просмотров: 3034
  • 24 февраля 2016, 04:29
  • div15
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

+
0
extern bool CloseRevers = true; // закрывать ордера при встречном сигнале
Этот момент поясните подробнее?
Редактирован: 24 февраля 2016, 18:27
avatar

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

  • 24 февраля 2016, 17:26
+
0
Open[1]<Close[1] && Open[0]>Close[1] была покупка если Open[1]>Close[1] && Open[0]<Close[1] продажа и закрываем покупку и также с продажой
avatar

  15  div15 Автор Сообщений: 71 - div15

  • 24 февраля 2016, 19:18
+
0
а если открыта серия ордеров?
avatar

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

  • 24 февраля 2016, 19:22
+
0
серия ордеров на одной свечке.дальше серия ордеров на другой свечке
avatar

  15  div15 Автор Сообщений: 71 - div15

  • 24 февраля 2016, 19:24
+
0
Опишите все максимально подробно, со скринами рисунками.
Вот пример ТЗ: am2.opentraders.ru/29048.html
Пока что нет полной ясности в задании.
avatar

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

  • 24 февраля 2016, 19:36
+
0
if (CloseRevers) CLOSEORDER(OP_SELL)закрывает бай if (CloseRevers) CLOSEORDER(OP_BUY)
закрывает селл

void CLOSEORDER(int ord)
{
 bool cl;
   for (int i=0; i<OrdersTotal(); i++)
   {                                               
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
         {
            if (OrderType()==OP_BUY && ord==OP_BUY)
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,CLR_NONE);
            if (OrderType()==OP_SELL && ord==OP_SELL)
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,CLR_NONE);
         }
      }   
   }
}
функция закрытия ордеров при встречном сигнале

надо сделать ее отключаемой
avatar

  15  div15 Автор Сообщений: 71 - div15

  • 24 февраля 2016, 19:46
+
0
сейчас сделаю как я все это понимаю :) 
avatar

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

  • 24 февраля 2016, 19:49
+
0
ладно делайте
avatar

  15  div15 Автор Сообщений: 71 - div15

  • 24 февраля 2016, 19:51
+
0
таможня дает добро
avatar

  45  Bishop Сообщений: 5720 - АЛЬФАХАМЕЦ-Машковод

  • 24 февраля 2016, 20:07
+
0
Я сделал, только вы понимаете смысл этих условий? Вторая часть — значения как правило равны.


сигналы 
Open[1]<Close[1] && Open[0]>Close[1] покупка
Open[1]>Close[1] && Open[0]<Close[1] продажа



//+------------------------------------------------------------------+
//|                                                  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    Delta          = 100;       // дельта
extern double Loss           = 9000;      // убыток в валюте
extern double Profit         = 10;        // профит в валюте
extern double Lots           = 0.01;      // лот
extern double KLot           = 2;         // увеличение лота
extern double MaxLot         = 10;        // максимальный лот
extern int    CloseRevers    = 0;         // 1-закрывать ордера при встречном сигнале
extern int    Slip           = 30;        // проскальзывание
extern int    Magic          = 123;       // магик

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--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) profit+=OrderProfit()+OrderSwap()+OrderCommission();
           }
        }
     }
   return(profit);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int LastDealResult()
  {
   int result=0;
   if(OrdersHistoryTotal()==0)
     {
      result=0;
     }
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderProfit()>0)
           {
            result=1;//tp  
           }
         if(OrderProfit()<0)
           {
            result=2;//sl  
           }
        }
     }
   return(result);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;
   if(CountTrades()>0) lot=NormalizeDouble(Lots*MathPow(KLot,CountTrades()),2);
   if(lot>MaxLot)lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseOrder(int ord)
  {
   bool cl;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==ord && ord==0) cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,CLR_NONE);
            if(OrderType()==ord && ord==1) cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,CLR_NONE);
           }
        }
     }
   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);

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

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

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

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

   if(LastDealResult()==1)DelOrder();
   if(AllProfit()>=Profit || AllProfit()<=-Loss)
     {
      CloseAll();
      DelOrder();
     }

   if(CloseRevers>0)
     {
      // sell кроем баи
      if(Open[1]>Close[1] && Open[0]<Close[1]) CloseOrder(0);
      // buy кроем селлы
      if(Open[1]<Close[1] && Open[0]>Close[1]) CloseOrder(1);
     }

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

avatar

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

  • 24 февраля 2016, 20:23
+
0
спасибо поставил на проверку
avatar

  15  div15 Автор Сообщений: 71 - div15

  • 24 февраля 2016, 20:55
комментарий был удален 2016-03-11 22:50:56 div15


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