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

Рейтинг 2146



РЕКОМЕНДУЮ



Алерт к зиг-загу

Приветствую.Прошу написать советник на основе данного индикатора.
-Zig zag bez pererisovki.mq4 (2 Kb)
1)при появлении новой линии зиг-зага
— алерт (звук)
— алерт (mail).
2)
При появлении линии вниз, советник предлагает бай ордер, если линия направлена верх-селл.
Настраиваемые параметры:
1)Размер риска в валюте депозита
2)Количество пунктов до стоп-лосса
Количество пунктов до тейка
  • 0
  • Просмотров: 2681
  • 6 июня 2017, 22:36
  • Bluesman
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

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

+
+1
Посмотрю сегодня.
avatar

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

  • 7 июня 2017, 17:33
+
0
Риск по какой формуле будем считать?

Кроме этого все есть:




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

//--- Inputs
extern double Lots       = 0.1;      // лот
extern int StopLoss      = 555;      // лось
extern int TakeProfit    = 555;      // язь
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик

extern string IndName    = "ZZ";
extern int Length        = 6;
extern int CountBars     = 1000;   // Количество отображаемых баров

datetime t=0;
bool b=true,s=true;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=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);
     }

   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,NULL,Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Sig()
  {
   int sig=0;
   for(int i=0;i<=CountBars;i++)
     {
      if(iCustom(NULL,0,IndName,Length,CountBars,0,i)==High[i]) {sig=1;break;}
      if(iCustom(NULL,0,IndName,Length,CountBars,0,i)==Low[i])  {sig=2;break;}
     }
   return(sig);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   if(Sig()==2 && b)
     {
      PutOrder(0,Ask);
      Alert("Signal Buy!");
      SendMail("Signal","Signal Buy!");
      b=false;
      s=true;
     }

   if(Sig()==1 && s)
     {
      PutOrder(1,Bid);
      Alert("Signal Sell!");
      SendMail("Signal","Signal Sell!");
      s=false;
      b=true;
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades()<1)
     {
      OpenPos();
     }

   Comment("\n sig: ",Sig());
  }
//+------------------------------------------------------------------+

avatar

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

  • 7 июня 2017, 21:03
+
0
Пока реализовано по такой примитивной формуле: www.opentraders.ru/downloads/1600/


//+------------------------------------------------------------------+
//| Лот на стоп от депо                                              |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;
   if(Lots==0)
     {
      lot=NormalizeDouble(AccountBalance()*Risk/(AccountBalance()*StopLoss),2); // 10000*1000/10000*1000=1
     }
   return(lot);
  }
avatar

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

  • 7 июня 2017, 22:08
+
0
Андрей, в идеале: в настройках я указываю какой сумой готов рискнуть, а советник считает каким лотом заходить учитывая количество пунктов от стопа до ордера.
Возможно это поможет:
//+------------------------------------------------------------------+
//|                                                 StopLossLine.mq4 |
//+------------------------------------------------------------------+
//#property show_inputs

//--- внешние переменные ---//
extern double RiskSize=10; // Размер риска в валюте депозита
extern   bool Use_Lock=false; // false/true - выкл./вкл. использование лока
//extern string NameLine="SL";
extern  color TextColor=Red; // Цвет текста на графике
extern    int FrontSize=7; // Размер шрифта для текста на графике  
extern    int Slippage=5; // Максимально допустимый размер проскальзывания (в пунктах)

//--- глобальные переменные ---//
double TickSize, TickValue, Spread, StopLevel, MinLot, MaxLot, LotStep;
   int order_type, order_ticket, orders_total;
  bool Ans, Activate, FatalError, FreeMarginAlert;

//--- Основная ф-ция скрипта ---//
int start()
 {
  double SL_Lev, SL_Size, Lot_Size;

  // получение рыночной информации
  GetMarketInfo();

  //if(ObjectFind(NameLine)!=-1) SL_Lev=ObjectGet(NameLine,OBJPROP_PRICE1); else return(0);
  SL_Lev=WindowPriceOnDropped();

  if(ND(SL_Lev-Bid)>=StopLevel) { // sell
   SL_Size=ND(SL_Lev-Bid)/Point;
   Lot_Size=GetLot(SL_Size);
   TradeSell(Lot_Size);
   if(order_ticket!=-1) {
    if(!Use_Lock) {
     Modify_SL(order_ticket,SL_Lev);
     /*if(Ans) ObjDel();*/ }
    else {
     BuyStop(SL_Lev,Lot_Size);
     /*if(order_ticket!=-1) ObjDel();*/ } } }

  else if(ND(Ask-SL_Lev)>=StopLevel) { // buy
   SL_Size=ND(Ask-SL_Lev)/Point;
   Lot_Size=GetLot(SL_Size);
   TradeBuy(Lot_Size); 
   if(order_ticket!=-1) {
    if(!Use_Lock) {
     Modify_SL(order_ticket,SL_Lev);
     /*if(Ans) ObjDel();*/ }
    else {
     SellStop(SL_Lev,Lot_Size); 
     /*if(order_ticket!=-1) ObjDel();*/ } } }

  else { 
   Alert("Линия находится слишком близко к текущему значению цены!");
   return(0); }

  // вывод информации на график
  string ObjName="GetLotSize";
  if(ObjectFind(ObjName)==-1) {
   ObjectCreate(ObjName, OBJ_LABEL, 0, 0, 0);
   ObjectSet(ObjName, OBJPROP_CORNER, 0);
   ObjectSet(ObjName, OBJPROP_XDISTANCE, 10);
   ObjectSet(ObjName, OBJPROP_YDISTANCE, 15); }
  ObjectSetText(ObjName, "Размер лота : " + DoubleToStr(Lot_Size, 2), FrontSize, "Courier New", TextColor);

  return(0);
 }

//--- Ф-ция получение рыночной информации(окружения) ---  ---//
void GetMarketInfo() {
 TickSize=MarketInfo(Symbol(), MODE_TICKSIZE); // Размер минимального изменения цены
 TickValue=MarketInfo(Symbol(), MODE_TICKVALUE); // Стоимость одного пункта
 Spread=MarketInfo(Symbol(), MODE_SPREAD); // Текущий спред
 StopLevel=MarketInfo(Symbol(), MODE_STOPLEVEL)*Point; // Текущий уровень стопов
 MinLot=MarketInfo(Symbol(), MODE_MINLOT); // Минимальный разрешенный объем
 MaxLot=MarketInfo(Symbol(), MODE_MAXLOT); // Максимальный разрешенный объем
 LotStep=MarketInfo(Symbol(), MODE_LOTSTEP); // Шаг приращения объема
}

//--- Расчет объема сделки с учётом размера стоп-лосса ---  ---//
double GetLot(double SL_Size) {
 double lot, SL;

 if(TickValue==0.0) return(0.0); // Ошибка при получении стоимости тика

 if(TickSize==Point) {
  SL=SL_Size+Spread; }
 else if(TickSize<Point) { 
  SL=(SL_Size+Spread)*(Point/TickSize); }
 else if(TickSize>Point) { 
  SL=(SL_Size+Spread)*(TickSize/Point); }

 lot=RiskSize/SL/TickValue; // Рассчитаем объем
 return(NL(lot)); /* Округлим значение до ближайшего */ }


//--- Ф-ция открытия позиции на покупку(по рынку) ---  ---//
void TradeBuy(double lot) {
 int i;
 order_ticket=-1;
 RefreshRates(); // Обновим данные

 if(AccountFreeMarginCheck(Symbol(), OP_BUY, lot)<=0.0 || GetLastError()==134) {
  if(!FreeMarginAlert) {
   Alert("Недостаточно средств для отправки приказа. Free Margin = ", DoubleToStr(AccountFreeMargin(),2));
   FreeMarginAlert=true; } 
  return; }
 FreeMarginAlert=false;  

 while(order_ticket<0 && i<5) {   
  // Отправка торгового запроса  
  order_ticket=OrderSend(Symbol(),OP_BUY,lot,Ask,Slippage,NULL,NULL,"",NULL,NULL,Blue);
  if(order_ticket<0) { if(!Errors(GetLastError())) return; } i++; } /*end of while*/ } 
        
//--- Ф-ция открытия позиции на продажу(по рынку) ---  ---//
void TradeSell(double lot) {
 int i;
 order_ticket=-1; 
 RefreshRates(); // Обновим данные

 if(AccountFreeMarginCheck(Symbol(), OP_SELL, lot)<=0.0 || GetLastError()==134) {
  if(!FreeMarginAlert) {
   Alert("Недостаточно средств для отправки приказа. Free Margin = ", DoubleToStr(AccountFreeMargin(),2));
   FreeMarginAlert=true; } 
  return; }
 FreeMarginAlert=false; 
 
 while(order_ticket<0 && i<5) {   
  // Отправка торгового запроса 
  order_ticket=OrderSend(Symbol(),OP_SELL,lot,Bid,Slippage,NULL,NULL,"",NULL,NULL,Red);
  if(order_ticket<0) { if(!Errors(GetLastError())) return; } i++; } /*end of while*/ }

//--- Ф-ция модификации стоп-лосса ---  ---//
void Modify_SL(int OrdTicket, double SL_Lev) {
 double op, tp;
    int i;

 Ans=false;
 if(!OrderSelect(OrdTicket,SELECT_BY_TICKET)) return; 

 op=OrderOpenPrice();
 tp=OrderTakeProfit();

 i=0;
 while(!Ans && i<5) {
 //--- Модификация открытой позиции ---//
 Ans=OrderModify(OrdTicket,ND(op),ND(SL_Lev),ND(tp),0,Red);
 if(!Ans) { if(!Errors(GetLastError())) break; } i++; } /*end of while*/ }

//--- Ф-ция установки BuyStop ордера ---  ---//
void BuyStop(double LevInst, double lot) {
 int i=0;

 order_ticket=-1;
 while(order_ticket<0 && i<5) {   
  // Отправка торгового запроса  
  order_ticket=OrderSend(Symbol(),OP_BUYSTOP,NL(lot),ND(LevInst),0,NULL,NULL,"",NULL,0,Blue);         
  if(order_ticket<0) { if(!Errors(GetLastError())) return; } i++; } // end of while 
}

//--- Ф-ция установки SellStop ордера ---  ---//
void SellStop(double LevInst, double lot) {
 int i=0;

 order_ticket=-1;
 while(order_ticket<0 && i<5) {   
  // Отправка торгового запроса  
  order_ticket=OrderSend(Symbol(),OP_SELLSTOP,NL(lot),ND(LevInst),0,NULL,NULL,"",NULL,0,Red);         
  if(order_ticket<0) { if(!Errors(GetLastError())) return; } i++; } // end of while 
}

//--- Ф-ция обработки ошибок при отправке торговых запросов ---  ---//
bool Errors(int Error) {
 if(Error==0) return(false); // Нет ошибки

 switch(Error) { 
  // Преодолимые ошибки:
  case 4:   // Торговый сервер занят  
   Sleep(3000);
   RefreshRates(); // Обновим данные
   return(true); // Ошибка преодолимая
  case 129: // Неправильная цена
  case 135: // Цена изменилась
   RefreshRates(); // Обновим данные
   return(true);   // Ошибка преодолимая
  case 136: // Нет цен. Ждём новый тик.
   while(RefreshRates()==false) // До нового тика
    Sleep(1);                   // Задержка в цикле
   return(true);                // Ошибка преодолимая
  case 137: // Брокер занят 
   Sleep(3000);
   RefreshRates(); // Обновим данные
   return(true); // Ошибка преодолимая
  case 146: // Подсистема торговли занята
   Sleep(500);     // Простое решение
   RefreshRates(); // Обновим данные
   return(true);   // Ошибка преодолимая
  // Критические ошибки:
  case 2 :  // Общая ошибка
  case 5 :  // Старая версия клиентского терминала
  case 64:  // Счет заблокирован
  case 133: // Торговля запрещена
   Alert("Критическая ошибка - эксперт остановлен!");
   FatalError=true;
   return(false); // Критическая ошибка 
  default:  // Другие варианты
   return(false); } }

//--- Проверка объема на корректность и округление ---  ---//
double NL(double L) {
 return(MathRound(MathMin(MathMax(L, MinLot), MaxLot)/LotStep)*LotStep); }

//--- Ф-ция приведения значений к точности одного пункта ---  ---//
double ND(double A) { 
 return( NormalizeDouble(A, Digits) ); }

//--- Ф-ция удаления линии ---  ---//
//void ObjDel() {
// if(ObjectFind(NameLine)!=-1) ObjectDelete(NameLine); }

Буду безмерно благодарен если за одно и в этот код включишь расстояние до тейка (не посчитай за наглость)*stesnitelno* 
Редактирован: 7 июня 2017, 22:19
avatar

  17  Bluesman Автор Сообщений: 67

  • 7 июня 2017, 22:10
+
0
Андрей, закинул на график, он открывает ордера без спроса.
Попробую еще раз. При появление линии зиг-зага на экран выходит сообщение — алерт «на таком то графике появилась линия.» Советник предлагает войти в позицию зависимо от направления линии с настройками: Размер риска в валюте депозита, Количество пунктов до стоп-лосса, Количество пунктов до тейка.
А дальше я или вхожу в позицию или отклоняю сигнал.
Редактирован: 7 июня 2017, 23:03
avatar

  17  Bluesman Автор Сообщений: 67

  • 7 июня 2017, 22:47
+
0
он открывает ордера без спроса.
Попробую еще раз. При появление линии зиг-зага на экран выходит сообщение — алерт «на таком то графике появилась линия.» Советник предлагает войти в позицию зависимо от направления линии с настройками


Советник не ведет диалог с пользователем, а открывается по сигналу.
avatar

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

  • 8 июня 2017, 17:32
+
0
Добавил лот из кода: www.opentraders.ru/downloads/1600/

Чтобы советник не открывал позу сразу, отключайте автоторговлю. А советник открывается в направлении луча, как прописано в ТЗ.
avatar

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

  • 8 июня 2017, 18:24
+
0
Спорить не буду.Я увы не программист.
avatar

  17  Bluesman Автор Сообщений: 67

  • 8 июня 2017, 21:10
+
0
С окошком можно сделать, но это не ко мне.
avatar

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

  • 8 июня 2017, 21:16
+
0
А если подкину код советника с функцией вывода на экран окошка?*help* 
Редактирован: 8 июня 2017, 21:29
avatar

  17  Bluesman Автор Сообщений: 67

  • 8 июня 2017, 21:25
+
0
Только если будет свободное время.
avatar

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

  • 8 июня 2017, 21:26
+
0
Буду безмерно благодарен если за одно и в этот код включишь функцию выбора расстояние до тейка (не посчитай за наглость)

Прости за назойливость, как насчет этой просьбы?*help* 
avatar

  17  Bluesman Автор Сообщений: 67

  • 8 июня 2017, 21:38
+
0
В советнике есть стопы.
avatar

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

  • 8 июня 2017, 21:45
+
0
В советнике есть стопы.

Я не об этом. Второй скрипт, когда кидаешь на график, ставит стоп, открывает ордер, но не ставит тейка.Возможно ли это добавить?

avatar

  17  Bluesman Автор Сообщений: 67

  • 8 июня 2017, 21:51
+
0
Тейк есть в советнике. Кидай настройки и логи, посмотрю.
avatar

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

  • 8 июня 2017, 22:20
+
0
Спасибо, в любом случае, Андрей, за любезно проделанную работу. Да прибудет с тобой сила!
avatar

  17  Bluesman Автор Сообщений: 67

  • 8 июня 2017, 22:20
+
0
Я наверное очень косноязычный:)  Одним словом, русский не родной язык*???* 
Скинув скрипт который начинается с
//+------------------------------------------------------------------+
//|                                                 StopLossLine.mq4 |
//+------------------------------------------------------------------+

в конце сообщения попросил включить в этот скрипт функцию тейка.
avatar

  17  Bluesman Автор Сообщений: 67

  • 8 июня 2017, 22:33
+
+1
Править скрипт это уже другой заказ.
avatar

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

  • 9 июня 2017, 17:57

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