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

Рейтинг 2086



РЕКОМЕНДУЮ



Советник помощник

Приветствую. Прошу добавить в данный помощник выставление тейка от расчета 1 к 3.
//+------------------------------------------------------------------+
//|                                                 StopLossLine.mq4 |
//+------------------------------------------------------------------+
//#property show_inputs

//--- внешние переменные ---//
extern double RiskSize=50; // Размер риска в валюте депозита
extern   bool Use_Lock=false; // false/true - выкл./вкл. использование лока
//extern string NameLine="SL";
extern  color TextColor=Red; // Цвет текста на графике
extern    int FrontSize=10; // Размер шрифта для текста на графике  
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); }

  • 0
  • Просмотров: 2843
  • 4 июля 2017, 20:59
  • Bluesman
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

+
0
Чужим кодом не занимаюсь.
avatar

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

  • 4 июля 2017, 21:03
+
0
С нуля такой советник по ТЗ реально написать.
avatar

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

  • 8 июля 2017, 11:50
+
+1
Сделал вариант. Тянем за линию стопа и вместе с ней меняется и тейк пропорционально коэффициенту в настройках: www.opentraders.ru/downloads/1631/

extern double Koef = 2;  // коэффициент для тейка


avatar

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

  • 9 июля 2017, 13:56
+
0
Андрей, перетаскиваю на график, но ничего не происходит.*???* 
avatar

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

  • 10 июля 2017, 17:14
+
0
По умолчанию в настройках стоит 0, т.е. не открывает поз, 1-бай, 2-селл
avatar

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

  • 10 июля 2017, 18:30
+
0
Я это заметил сразу и изменил, но ордер не открылся.
avatar

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

  • 10 июля 2017, 20:40
+
0
Открылся. Скидывайте логи скрины настройки.

avatar

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

  • 10 июля 2017, 20:46
+
0
avatar

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

  • 10 июля 2017, 21:13
+
0
Прошу написать с нуля
ТЗ:
Советник перетаскивается на график.Если мышь выше цены открывается селл, если ниже бай. На указанном мышкой месте ставиться стоп, фиксированным размером риска от депозита.Какой будет лот, зависимо от расстояния цены, советник считает сам.Главное стоп не превышает сумму указанным в коде. Исходя от расстояния стопа и цены в советнике прописывается коэффициент тейка.
Как то так.
avatar

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

  • 10 июля 2017, 21:08
+
0
Вчера когда было много свободного времени я может быть еще и взялся за такой советник, а сейчас когда работа и речи быть не может. Поэтому юзайте упрощенный вариант.
avatar

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

  • 10 июля 2017, 21:39
+
0
Удачи в делах, будет время — посмотрите!
avatar

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

  • 10 июля 2017, 21:54
+
+1
Добавил трюки с перетаскиванием и установкой стопа кликом по графику:


//+------------------------------------------------------------------+
//|                                                    StopLines.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 double Koef       = 2;        // коэффициент для тейка
extern int StopLoss      = 300;      // лось
extern int TakeProfit    = 600;      // язь
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик

extern string NameLine="SL";
//+------------------------------------------------------------------+
//| 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,"",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);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   if(WindowPriceOnDropped()<Ask)
     {
      PutOrder(0,Ask);
      if(StopLoss>0)   PutHLine("SL",Bid-StopLoss*Point,Red);
      if(TakeProfit>0) PutHLine("TP",Bid+TakeProfit*Point,Blue);
     }

   if(WindowPriceOnDropped()>Bid)
     {
      PutOrder(1,Bid);
      if(StopLoss>0)   PutHLine("SL",Bid+StopLoss*Point,Red);
      if(TakeProfit>0) PutHLine("TP",Bid-TakeProfit*Point,Blue);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double FindLevel(string name)
  {
   double lev=0;
   for(int i=0;i<ObjectsTotal();i++)
     {
      if(ObjectName(i)==name) lev=ObjectGetDouble(0,name,OBJPROP_PRICE);
     }
   return(lev);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutHLine(string name,double price,color clr)
  {
   ObjectDelete(0,name);
   ObjectCreate(0,name,OBJ_HLINE,0,0,price);
//--- установим цвет линии
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- установим стиль отображения линии
   ObjectSetInteger(0,name,OBJPROP_STYLE,0);
//--- установим толщину линии
   ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Mode()
  {
   bool m;
   double sl=0;

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            sl=MathAbs(OrderOpenPrice()-NormalizeDouble(FindLevel("SL"),Digits));

            if(OrderType()==OP_BUY)
              {
               if(OrderStopLoss()!=NormalizeDouble(FindLevel("SL"),Digits))
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(FindLevel("SL"),Digits),NormalizeDouble(OrderOpenPrice()+sl*Koef,Digits),0,Yellow);
                  PutHLine("TP",NormalizeDouble(OrderOpenPrice()+sl*Koef,Digits),Blue);
                  return;
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(OrderStopLoss()!=NormalizeDouble(FindLevel("SL"),Digits))
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(FindLevel("SL"),Digits),NormalizeDouble(OrderOpenPrice()-sl*Koef,Digits),0,Yellow);
                  PutHLine("TP",NormalizeDouble(OrderOpenPrice()-sl*Koef,Digits),Blue);
                  return;
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   Mode();
   if(CountTrades()<1) OpenPos();

   Comment("\n SL: ",FindLevel("SL"),
           "\n TP: ",FindLevel("TP"));
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- если это события клика мышки на графике
   if(id==CHARTEVENT_CLICK)
     {
      //--- подготовим переменные
      int      x     =(int)lparam;
      int      y     =(int)dparam;
      datetime dt    =0;
      double   price =0;
      int      window=0;
      //--- преобразуем координаты X и Y  в терминах дата/время
      if(ChartXYToTimePrice(0,x,y,window,dt,price))
        {
         if(StopLoss==0) PutHLine("SL",price,Red);
         ChartRedraw(0);
        }
     }
  }
//+------------------------------------------------------------------+

avatar

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

  • 11 июля 2017, 06:28
+
0
Ордер не открывается.*???* 
avatar

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

  • 11 июля 2017, 12:47
+
0
Еще раз проверил, открывает. Проверьте кнопку автоторговля и улыбку в углу графика, соединение с интернетом и др. На скрине видно что у вас стоит предыдущая версия. Т.к. скрин маленький больше по нему ничего не скажешь, недостаточно информации чтобы найти причину.



avatar

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

  • 11 июля 2017, 17:41
+
0
Пардон,*stesnitelno*  с выставлением ордера разобрался. Теперь другая беда: передвигаешь стоп, он обратно на место встает.*wizard*  И авто определение направления ордера упростила бы задачу.*neo* 
Посмотрел более тщательно. Андрей из ТЗ — только выставление ордера.
Редактирован: 12 июля 2017, 00:35
avatar

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

  • 12 июля 2017, 00:24
+
+1
Есть все кроме автолота. Смотрите внимательно.
avatar

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

  • 12 июля 2017, 17:22

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