Kashtan
Игорь

 
Уровень 19

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


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

Рейтинг 2153



РЕКОМЕНДУЮ



Прошу написать советник

Техническое задание:
• Один раз в сутки в заданное в настройках время (час торговли) советник сравнивает текущую цену (Open новой свечи) с ценой Open за N предшествующих свечей
• Для возможности задать число свечей нужен параметр в настройках (на скриншотах их число было бы равно 10)
• Для рыночного и отложенного ордеров нужны отдельные наборы параметров (Lot, T.P., S.L.)
• Если текущая цена (красное перекрестие) ниже цены Open за N предшествующих свечей (жёлтое перекрестие), советник открывает Sell и ставит Buy Stop на верхний экстремум за данный период (зелёная линия)


• Если текущая цена выше цены Open за N предшествующих свечей, советник открывает Buy и ставит Sell Stop на нижний экстремум за данный период


• Стоповый ордер должен быть удалён, если он не успел активироваться к моменту достижения T.P. рыночного ордера (до следующего дня советник ничего не делает)
• Если стоповый ордер был активирован и достиг своего T.P. — рыночный должен быть закрыт по текущей цене (до следующего дня советник ничего не делает)
• Если в случае активации стопового ордера цена достигла T.P. рыночного ордера раньше чем стопового, стоповый ордер должен быть закрыт по текущей цене (до следующего дня советник ничего не делает)

Настройки:
• Час торговли
• Свечи для подсчёта
• Набор параметров для рыночного ордера
• Набор параметров для стопового ордера
  • +1
  • Просмотров: 4223
  • 30 сентября 2016, 18:39
  • Kashtan
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

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

+
0
После выходных уже.
avatar

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

  • 30 сентября 2016, 22:30
0
*good* 
avatar

  19  Kashtan Автор Сообщений: 739 - Игорь

  • 1 октября 2016, 00:32
0
Ещё было бы не плохо иметь в настройках дельту. То есть перед тем как открыть по рынку и ставить отложку, советник сравнивал бы расстояние между этими предполагаемыми ордерами с тем что заданно в настройках. Если расстояние окажется больше заданного, в этот день не торговать. Возможно логичнее сделать, чтоб сначала советник решал торговать или нет, и если дельта позволяет торговать — уже определял направление рыночного и стопового соответственно
Редактирован: 1 октября 2016, 13:10
avatar

  19  Kashtan Автор Сообщений: 739 - Игорь

  • 1 октября 2016, 13:05
0
В первоначальном Т.З. стоп лосс в настройках по факту не нужен, так как в случае активации отложки один из ордеров будет закрываться с профитом с одновременным закрытием оставшегося ордера с текущим убытком. Но есть пара вариантов сделать по другому, хотя и чуть сложнее. Можем это в ЛК обсудить?
avatar

  19  Kashtan Автор Сообщений: 739 - Игорь

  • 1 октября 2016, 14:02
0
Я буду ориентироваться на первоначальное ТЗ. Изменение задания крайне нежелательно.
avatar

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

  • 2 октября 2016, 10:15
0
Всё, вопросов нет:) 
avatar

  19  Kashtan Автор Сообщений: 739 - Игорь

  • 2 октября 2016, 10:56
0
Советник сложный, большинство функций уникальные и нужно писать с нуля. Пока сделал основную часть, если выполнение затянется, тогда к платному.

Сделано все кроме этого:

• Если стоповый ордер был активирован и достиг своего T.P. — рыночный должен быть закрыт по текущей цене (до следующего дня советник ничего не делает)
• Если в случае активации стопового ордера цена достигла T.P. рыночного ордера раньше чем стопового, стоповый ордер должен быть закрыт по текущей цене (до следующего дня советник ничего не делает)





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

//--- Inputs
extern double Lot1       = 0.1;      // лот 1
extern double Lot2       = 0.1;      // лот 2
extern int StopLoss1     = 200;      // лось 1
extern int StopLoss2     = 200;      // лось 2
extern int TakeProfit1   = 300;      // язь 1
extern int TakeProfit2   = 300;      // язь 2
extern int StartHour     = 0;        // час начала торговли
extern int Slip          = 30;       // реквот
extern int Shift         = 1;        // начальный бар
extern int Count         = 9;        // конечный бар
extern int Magic         = 123;      // магик
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
 
{
//---

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

 
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price,double lot=0.1,double sl=0,double tp=0)
 
{
   
int r=0;
   color clr
=Green;

   
if(type==1 || type==3 || type==5)
     
{
      clr
=Red;
     
if(sl>0) sl=NormalizeDouble(price+sl*Point,Digits);
     
if(tp>0) tp=NormalizeDouble(price-tp*Point,Digits);
     
}

   
if(type==0 || type==2 || type==4)
     
{
      clr
=Blue;
     
if(sl>0) sl=NormalizeDouble(price-sl*Point,Digits);
     
if(tp>0) tp=NormalizeDouble(price+tp*Point,Digits);
     
}

   r
=OrderSend(NULL,type,lot,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 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());
           
}
       
}
     
}
 
}
//+------------------------------------------------------------------+
//| Одна сделка в день                                               |
//+------------------------------------------------------------------+
bool OneDayDeal()
 
{
   
bool result=true;
   
if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     
{
     
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
       
{
         
if(OrderType()<6 && TimeDay(OrderOpenTime())==Day())
           
{
            result
=false;//tp  
           
}
       
}
     
}
   
return(result);
 
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
 
{
   
int high=iHighest(NULL,0,MODE_HIGH,Count,Shift);
   
int low=iLowest(NULL,0,MODE_LOW,Count,Shift);
   
double h=High[high];
   
double l=Low[low];

   
if(TimeCurrent()>=StringToTime((string)StartHour+":00") && OrdersTotal()<1 && OneDayDeal())
     
{
     
if(Close[Shift]>Close[Count])
       
{
         
PutOrder(0,Ask,Lot1,StopLoss1,TakeProfit1);
         
PutOrder(5,l,Lot2,StopLoss2,TakeProfit2);
       
}

     
if(Close[Shift]<Close[Count])
       
{
         
PutOrder(1,Bid,Lot1,StopLoss1,TakeProfit1);
         
PutOrder(4,h,Lot2,StopLoss2,TakeProfit2);
       
}
     
}

   
if(CountTrades()<1) DelOrder();
 
}
//+------------------------------------------------------------------+

avatar

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

  • 2 октября 2016, 11:49
0
Сейчас похоже на правду :)  www.opentraders.ru/downloads/1342/

avatar

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

  • 2 октября 2016, 12:34
+
0
• Если стоповый ордер был активирован и достиг своего T.P. — рыночный должен быть закрыт по текущей цене (до следующего дня советник ничего не делает)
• Если в случае активации стопового ордера цена достигла T.P. рыночного ордера раньше чем стопового, стоповый ордер должен быть закрыт по текущей цене (до следующего дня советник ничего не делает)


Здесь на самом деле всё достаточно просто:)  То есть если стоповый активировался, в рынке уже два ордера. И когда один из них закрылся по тейку, советнику надо оставшийся закрыть по текущему убытку
avatar

  19  Kashtan Автор Сообщений: 739 - Игорь

  • 2 октября 2016, 12:58
0
Я так и сделал.
avatar

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

  • 2 октября 2016, 13:02
0
Благодарю за работу!*good*  Будем тестить)
avatar

  19  Kashtan Автор Сообщений: 739 - Игорь

  • 2 октября 2016, 13:05
0
При использовании программы для тестов на тиковых данных тест пролетает, как будто нет котировок.
В журнале вот это

Другие советники работают.
avatar

  19  Kashtan Автор Сообщений: 739 - Игорь

  • 2 октября 2016, 17:13
+
0
Как то раз было такое с одним из советников Оху. Она поправила, всё заработало
avatar

  19  Kashtan Автор Сообщений: 739 - Игорь

  • 2 октября 2016, 17:34
0
настройки какие у вас, скрин нужен?
avatar

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

  • 2 октября 2016, 19:19
0
Настройки по умолчанию!
avatar

  19  Kashtan Автор Сообщений: 739 - Игорь

  • 2 октября 2016, 19:34
0
У меня нет такой ошибки. Пока не будет в моем терминале такой ошибки я никак ее не устраню, т.к. не знаю причину. У меня так в маркет целый месяц сов не проходил. У них есть ошибка у меня нет. Пока я их терминал не скачал в котором они проверяли таки не нашел причину. Спроси у Оксаны раз она встречалась с подобным, подскажет если вспомнит.
avatar

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

  • 2 октября 2016, 20:57
0
Если Оксана не сможет помочь, может через программу тест запустите?
Редактирован: 2 октября 2016, 21:50
avatar

  19  Kashtan Автор Сообщений: 739 - Игорь

  • 2 октября 2016, 21:05
+
0
Что за прога?
avatar

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

  • 2 октября 2016, 21:08
0
такая ошибка бывает когда используется обращение к барам, которых нет.
в тестере история идет по барам начиная с 0, то есть при обращении к любому i элементу массива в прошлом — выбивает ошибку размерности массива, т.к. таких элементов еще нет.
avatar

  17  vis Сообщений: 200 - ♫♪♫♪

  • 5 октября 2016, 16:46
комментарий был удален 2016-10-02 21:47:25 Kashtan

комментарий был удален 2016-10-02 21:47:29 Kashtan

0
avatar

  19  Kashtan Автор Сообщений: 739 - Игорь

  • 2 октября 2016, 21:11
0
По мнению знатоков
ошибка array out of range

Поправите?
avatar

  19  Kashtan Автор Сообщений: 739 - Игорь

  • 4 октября 2016, 22:06
0
От какого брокера терминал? Без тикстори работает?
avatar

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

  • 4 октября 2016, 23:42
+
0
Ошибка в этой строке:


   
double h=High[high];


Ссылка на бар:

int high=iHighest(NULL,0,MODE_HIGH,Count,Shift); 


У вас что там баров нет вообще получается?
Я с тикстори не работаю.
avatar

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

  • 4 октября 2016, 23:53
+
0
Для тикстори в начале функции OnTick() надо проверить Shift:
if(Bars<=Shift) return;
avatar

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

  • 5 октября 2016, 00:55
+
+1
Я сделал и скомпилировалось без ошибок

Теперь в журнале так*cry* 
avatar

  19  Kashtan Автор Сообщений: 739 - Игорь

  • 5 октября 2016, 05:43
+
0
сделай скрин с 147 по 160 строчки кода
avatar

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

  • 5 октября 2016, 12:22
+
0
Вот Оксаночка:) 

Тут возникли подозрения, что и при простом тестировании не всё по системе происходит. Пока обычными тестами займусь
avatar

  19  Kashtan Автор Сообщений: 739 - Игорь

  • 5 октября 2016, 17:56
+
+2
в 149 строке вместо:
if(Bars<=Shift) return;

сделай:
if(Bars<=MathMax(Shift, Count)+2) return;

Редактирован: 5 октября 2016, 18:02
avatar

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

  • 5 октября 2016, 18:00
0
*bravo*  Всё заработало!!*good* 
avatar

  19  Kashtan Автор Сообщений: 739 - Игорь

  • 5 октября 2016, 18:21
0
А скомпилированный исправленный в студию можно :)  я неумеха… спасибо заранее
avatar

  23  poker Сообщений: 852

  • 5 октября 2016, 19:57
+1
Лови
//+------------------------------------------------------------------+
//|                                                        Delta.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double Lot1       = 0.1;      // лот 1
extern double Lot2       = 0.1;      // лот 2
extern int StopLoss1     = 200;      // лось 1
extern int StopLoss2     = 200;      // лось 2
extern int TakeProfit1   = 300;      // язь 1
extern int TakeProfit2   = 300;      // язь 2
extern int StartHour     = 0;        // час начала торговли
extern int Slip          = 30;       // реквот
extern int Shift         = 1;        // начальный бар
extern int Count         = 9;        // конечный бар
extern int Magic         = 123;      // магик

int counts=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
 
{
   
Comment("");
   
return(INIT_SUCCEEDED);
 
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
 
{
   
Comment("");
 
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price,double lot=0.1,double sl=0,double tp=0)
 
{
   
int r=0;
   color clr
=Green;

   
if(type==1 || type==3 || type==5)
     
{
      clr
=Red;
     
if(sl>0) sl=NormalizeDouble(price+sl*Point,Digits);
     
if(tp>0) tp=NormalizeDouble(price-tp*Point,Digits);
     
}

   
if(type==0 || type==2 || type==4)
     
{
      clr
=Blue;
     
if(sl>0) sl=NormalizeDouble(price-sl*Point,Digits);
     
if(tp>0) tp=NormalizeDouble(price+tp*Point,Digits);
     
}

   r
=OrderSend(NULL,type,lot,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 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());
           
}
       
}
     
}
 
}
//+------------------------------------------------------------------+
//| Одна сделка в день                                               |
//+------------------------------------------------------------------+
bool OneDayDeal()
 
{
   
bool result=true;
   
if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     
{
     
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
       
{
         
if(OrderType()<6 && TimeDay(OrderOpenTime())==Day())
           
{
            result
=false;//tp  
           
}
       
}
     
}
   
return(result);
 
}
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
 
{
   
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()==0 && (ot==0 || ot==-1))
             
{
               
RefreshRates();
               cl
=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
             
}
           
if(OrderType()==1 && (ot==1 || ot==-1))
             
{
               
RefreshRates();
               cl
=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
             
}
           
}
       
}
     
}
 
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
 
{
   
if(Bars<=MathMax(Shift, Count)+2) return;
   
int high=iHighest(NULL,0,MODE_HIGH,Count,Shift);
   
int low=iLowest(NULL,0,MODE_LOW,Count,Shift);
   
double h=High[high];
   
double l=Low[low];

   
if(TimeCurrent()>=StringToTime((string)StartHour+":00") && OrdersTotal()<1 && OneDayDeal())
     
{
     
if(Close[Shift]>Close[Count])
       
{
         
PutOrder(0,Ask,Lot1,StopLoss1,TakeProfit1);
         
PutOrder(5,l,Lot2,StopLoss2,TakeProfit2);
       
}

     
if(Close[Shift]<Close[Count])
       
{
         
PutOrder(1,Bid,Lot1,StopLoss1,TakeProfit1);
         
PutOrder(4,h,Lot2,StopLoss2,TakeProfit2);
       
}
     
}

   
if(CountTrades()>1) counts=CountTrades();

   
if(CountTrades()<1)
     
{
     
DelOrder();
      counts
=0;
     
}

   
if(counts==2 && CountTrades()<2)
     
{
     
CloseAll();
      counts
=0;
     
}

   
Comment("\n Count: ",counts);
 
}
//+------------------------------------------------------------------+
avatar

  19  Kashtan Автор Сообщений: 739 - Игорь

  • 6 октября 2016, 17:47
0
спасибосики! *good* 
avatar

  23  poker Сообщений: 852

  • 6 октября 2016, 18:08
комментарий был удален 2016-10-05 05:47:22 Kashtan

комментарий был удален 2016-10-05 05:47:25 Kashtan

комментарий был удален 2016-10-05 05:47:28 Kashtan

комментарий был удален 2016-10-05 05:47:40 Kashtan


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