Kashtan
Игорь

 
Уровень 19

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


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

Рейтинг 2147



РЕКОМЕНДУЮ



Советник на основе скользящих средних

Прошу создать советник на основе индикатора Moving Averages

ТЗ. Советник должен открывать рыночные ордера. Вход и выход происходит по определённым условиям. Суть советника в следующем: На график наносится одновременно несколько индикаторов Moving Averages имеющих разные настройки (для примера возьмём торговую систему Alligator). Когда на выбранном таймфрэйме свеча закрывается выше/ниже веера мувингов,

советник открывает ордер/ордера (количесвто задаётся в настройках) на покупку или продажу. Каждый ордер имеет индивидуальный уровень тейкпрофита (об этом ниже), но одинаковый объём. Закрытие группы ордеров происходит либо по тейкпрофиту, либо при противоположном пересечении ценой веера мувингов.

Условия для покупок:
1. Сигналом для покупок служит закрытие свечи выше веера мувингов.

2. В этот момент расстояние от текущей цены до ближайшего мувинга находится в пределах диапазона заданного в настройках. (на данной картинке это условие не выполнено)

То есть если в настройках стоит 50-500 и в это время от цены до верхнего мувинга расстояние к примеру 60 или 490 пунктов, советник ордера отркрывает. Если это расстояние 40 или 510 пунктов — ждёт следующего сигнала.
3. К открытым ордерам советник ставит тейкпрофит, каждому свой. Зависит от того, какой тейкпрофит задан для первого ордера.

Пример: Советник открыл пять ордеров по цене 1.04200. В настройках задан тейкпрофит 100 пунктов. Это значит что для первого ордер тейкпрофит будет на уровне 1.04300, для второго 1.04400, для третьего 1.04500, для четвёртого 1.04600 и для пятого 1.04700.

Условия для выхода из позиций:
Предположим рынок шёл в нашу сторону и первые три ордера закрылись по тейкпрофиту. В какой то момент цена развернулась, дошла до уровня открытия оставшихся двух ордеров и пересекла веер мувингов сверху вниз. Если в момент закрытия свечи цена по прежнему находится ниже ВСЕХ ТРЁХ мувингов

а не так, что например два мувига выше цены а третий ниже, то эти ордера закрываются. Если при этом расстояние от цены до нижнего мувинга находится в пределах заданного диапазона, то одновременно с закрытием старых ордеров открывается серия новых — только уже не на покупку а на продажу.

Условия для продаж и выход из позиций зеркальны условиям для покупок.

Настройки советника:
1) Торговый лот для ордеров
2) Количество открываемых ордеров при появлении сигнала
3) Тейкпрофит для первого ордера
4) Стоплосс (на всякий случай). Если 0, не ставим
5) Настройка отвечающая за расстояние от цены до мувингов, при котором будут открываться ордера (тот самый диапазон)
6) Время работы советника

Возможно при составлении списка настроек что то упустил, но в целом принцип работы думаю понятен:) 
  • +3
  • Просмотров: 12743
  • 3 марта 2016, 21:52
  • Kashtan
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

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

+
0
Это уже завтра, спать пора :) 
avatar

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

  • 3 марта 2016, 21:53
+
0
Само собой Андрей)) И спать и на работу завтра. Если что к вечеру сделаете, будем посмотреть:) 
avatar

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

  • 3 марта 2016, 23:29
+
0
avatar

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

  • 4 марта 2016, 11:35
+
0
Какими настройками в сов. задаются?:
3) Тейкпрофит для первого ордера

5) Настройка отвечающая за расстояние от цены до мувингов, при котором будут открываться ордера (тот самый диапазон)

Что есть Delta, что есть Points?

— Также, просьба там, сразу:
1. сделать функцию вкл/отключения реверса (открытия новых ордеров при закрытии предыдущих), оставив открытие новых ордеров только по основному сигналу (когда цена вновь выше/ниже всех МА),
— что-то много ложных входов при этом реверсе. Видимо реверс дорабатывать надо, ещё какие-то фильтры добавлять.

2. Закрытие ордеров, если не по ТП, то не когда цена уже ниже всех 3х МА,
а когда самая бастрая(младшая) МА пересечёт среднюю по значению МА. Больше профит, меньше убыток, и на таком уже, либо флет, либо разворот на первых же свечах можно отследить.

3. добавить трал и перевод БУ вместо ТП. Причём реверсные ордера тралить и в зоне убытка, т.е. закрывать и в убытке по-минимуму, не дожидаясь основного СЛ, если цена не туда пошла — обычно она либо хоть в зону БУ сначала заходит, либо конкретно сразу разворачивается/отскакивает в др. сторону.
Редактирован: 5 марта 2016, 10:51
avatar

  11  preasto Сообщений: 445

  • 5 марта 2016, 09:51
+
0
Андрей я вчера заходил но скопировать и протестировать тот сырой код не успел. То что сейчас в базе как то отличается от того варианта?
avatar

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

  • 5 марта 2016, 10:38
+
+1
Тейкпрофит для первого ордера (TakeProfit)
Настройка отвечающая за расстояние от цены до мувингов, при котором будут открываться ордера (Delta)
Points — это расстояние между тейкпрофитами ордеров
Ложные входы из-за отсутствия настройки нижней грани диапазона, о котором я написал ниже.
А по поводу
добавить трал и перевод БУ вместо ТП. Причём реверсные ордера тралить и в зоне убытка, т.е. закрывать и в убытке по-минимуму, не дожидаясь основного СЛ, если цена не туда пошла — обычно она либо хоть в зону БУ сначала заходит, либо конкретно сразу разворачивается/отскакивает в др. сторону.
это вы создайте свой топик уважаемый и там мудрите<img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' :) '>&nbsp; '>&nbsp;
Если Андрей сочтёт нужным реализовать что то из этого, я не против. Но для начала хотелось бы получить версию советника с изменениями о которых просил я 
Редактирован: 5 марта 2016, 12:58
avatar

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

  • 5 марта 2016, 12:50
+
0
Я это как раз к запрошенной доработке, если сразу такое реально заодно сделать.
Т.к. функция вкл/откл выставления ордеров по реверсу явно полезна,
и позволит дополнительно протестить и развивать советник.
Как и трал (как раз Андрей рядом в посте показал такой трал по МА), может его, например, или его код можно подсоединить.
Редактирован: 5 марта 2016, 17:05
avatar

  11  preasto Сообщений: 445

  • 5 марта 2016, 16:56
+
0
сделать функцию вкл/отключения реверса (открытия новых ордеров при закрытии предыдущих), оставив открытие новых ордеров только по основному сигналу (когда цена вновь выше/ниже всех МА)

Вы каким местом тех задание читали? Нет никакого реверса… Сигналом для открытия позиций является закрытие свечи выше/ниже мувингов в пределах заданного диапазона, который пока не доделан. Условием для закрытия ордеров не успевших закрыться по профиту является закрытие свечи с противоположной стороны мувингов. Понятно что эти ордера закроются с некоторым убытком, и вот если в этот момент цена была в пределах диапазона — заодно и новая серия ордеров открывается, в противоположном направлении от предыдущих естественно…
avatar

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

  • 5 марта 2016, 18:37
+
0
Если при этом расстояние от цены до нижнего мувинга находится в пределах заданного диапазона, то одновременно с закрытием старых ордеров открывается серия новых — только уже не на покупку а на продажу.

Я про эту часть. Сделать вкл/откл этой возможности.
Т.е. вариант так, чтобы серия новых(обратных) ордеров, ПО ВЫБОРУ, не открывалась при закрытии предыдущей (получается как реверс),
и новые ордера открывались только по новому осн. сигналу.
— Я погонял и мне показалось, что многие из таких открытых «в обратку» ордеров минусовые.
Скажем так: чтобы оставить более консервативный вариант по выбору, тоже.

А для закрытия не дошедших до ТП ордеров, как раз уместны БУ и трал.
Редактирован: 5 марта 2016, 19:38
avatar

  11  preasto Сообщений: 445

  • 5 марта 2016, 19:33
+
+1
Про нижний мувинг я написал потому что пример был для сигнала на покупку. Для сигнала на продажу и открытые по нему селловские ордера не достигшие профита должны закрываться при закрытии свечи выше верхнего мувинга. Кароче если после запуска советника первым был сигнал на покупку, он купит. Если был на продажу, он продаст. И прибыльность или убыточность текущих ордеров не зависит от того как закрылись предыдущие. Ты попробуй в настройках задать чтоб не по пять ордеров открывал, а по одному. И тейкпрофит поближе, посмотришь что получиться
Редактирован: 5 марта 2016, 21:56
avatar

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

  • 5 марта 2016, 21:55
+
+1
Благодарю за проделанную работу<img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' :) '>&nbsp; '>&nbsp; '>&nbsp;  В целом советник работает по системе за исключением двух моментов:

1) Под диапазоном я подразумевал две точки ограничения,
В этот момент расстояние от текущей цены до ближайшего мувинга находится в пределах диапазона заданного в настройках. То есть если в настройках стоит 50-500 и в это время от цены до верхнего мувинга расстояние к примеру 60 или 490 пунктов, советник ордера отркрывает. Если это расстояние 40 или 510 пунктов — ждёт следующего сигнала.
судя по всему нужна вторая дельта Андрей. С одной дельтой в текущем варианте возможно ограничить только максимально допустимое расстояние между мувингами и ценой при закрытии свечи. Я бы хотел чтоб и минимальное было, то есть ордера открывались если это расстояние предположим не больше 500 пунктов, и не меньше 100. Сейчас если в Дельте поставить 500, ордера будут открываться даже при расстоянии в 50 пунктов.

2) Дело в том, что я хочу тестировать этот советник с разными системами основанными на Moving Averages и Alligator был приведён в качестве примера. В ТЗ я написал что на график наносится одновременно несколько индикаторов. Отсюда предполагалось что их может быть произвольное количество (думаю в пределах 10), а советник просто будет ориентироваться на два «крайних» из них. Если так сделать сложно и необходимо настройки мувингов задавать в настройках самого советника, прошу вместо трёх полей сделать десять, в которых можно будет задавать не только период индикаторов но и остальные две настройки («метод» и «применить к»), так как в разных торговых системах эти два параметра тоже играют не маловажную роль<img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' :) '>&nbsp; '>&nbsp; 
Редактирован: 5 марта 2016, 13:12
avatar

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

  • 5 марта 2016, 12:09
комментарий был удален 2016-03-05 12:28:09 Kashtan

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

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

  • 5 марта 2016, 13:36
+
0
Понятненько:) 
avatar

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

  • 5 марта 2016, 14:13
+
0
Добавил 2 дельты и параметры машек: www.opentraders.ru/downloads/1085/


extern int StopLoss     = 1200;      // лось
extern int TakeProfit   = 1400;      // язь
extern int Delta1       = 100;       // минимальное расстояние от машки до закрытия
extern int Delta2       = 100;       // максимальное расстояние от машки до закрытия
extern int Points       = 100;       // сколько добавляем к тейку
extern int Count        = 5;         // количество ордеров
extern int Slip         = 50;        // реквот

extern int StartHour    = 0;         // час начала торговли
extern int StartMin     = 30;        // минута начала торговли
extern int EndHour      = 23;        // час окончания торговли
extern int EndMin       = 30;        // минута окончания торговли

extern int MA1Period    = 11;        // период МА1
extern int MA1Mode      = 0;         // 0-SMA
extern int MA1Price     = 0;         // 0-Close

extern int MA2Period    = 22;        // период МА1
extern int MA2Mode      = 0;         // 0-SMA
extern int MA2Price     = 0;         // 0-Close

extern int MA3Period    = 33;        // период МА1
extern int MA3Mode      = 0;         // 0-SMA
extern int MA3Price     = 0;         // 0-Close

extern int Magic        = 123;       // магик
extern double Lots      = 0.1;       // лот




Редактирован: 6 марта 2016, 10:49
avatar

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

  • 6 марта 2016, 10:48
+
0
Спасибо большое<img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' :) '>&nbsp;  Так то я просил для десяти, но пока добавьте пожалуйста хотя бы одну, чтоб четыре было. Если конечно не проще сделать, как я сначала предложил. То есть на график я сам накладываю нужное количество машек, и советник работает с тем что есть.
Редактирован: 6 марта 2016, 12:18
avatar

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

  • 6 марта 2016, 12:15
+
+1
Уговорили 9 :) 




//+------------------------------------------------------------------+
//|                                                          3MA.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property description "Martin expert advisor"

extern int StopLoss     = 1200;      // лось
extern int TakeProfit   = 1400;      // язь
extern int Delta1       = 100;       // минимальное расстояние от машки до закрытия
extern int Delta2       = 100;       // максимальное расстояние от машки до закрытия
extern int Points       = 100;       // сколько добавляем к тейку
extern int Count        = 5;         // количество ордеров
extern int Slip         = 50;        // реквот

extern int StartHour    = 0;         // час начала торговли
extern int StartMin     = 30;        // минута начала торговли
extern int EndHour      = 23;        // час окончания торговли
extern int EndMin       = 30;        // минута окончания торговли

extern int MA1Period    = 11;        // период МА1
extern int MA1Mode      = 0;         // 0-SMA
extern int MA1Price     = 0;         // 0-Close

extern int MA2Period    = 22;        // период МА1
extern int MA2Mode      = 0;         // 0-SMA
extern int MA2Price     = 0;         // 0-Close

extern int MA3Period    = 33;        // период МА1
extern int MA3Mode      = 0;         // 0-SMA
extern int MA3Price     = 0;         // 0-Close

extern int MA4Period    = 44;        // период МА1
extern int MA4Mode      = 0;         // 0-SMA
extern int MA4Price     = 0;         // 0-Close

extern int MA5Period    = 55;        // период МА1
extern int MA5Mode      = 0;         // 0-SMA
extern int MA5Price     = 0;         // 0-Close

extern int MA6Period    = 66;        // период МА1
extern int MA6Mode      = 0;         // 0-SMA
extern int MA6Price     = 0;         // 0-Close

extern int MA7Period    = 77;        // период МА1
extern int MA7Mode      = 0;         // 0-SMA
extern int MA7Price     = 0;         // 0-Close

extern int MA8Period    = 88;        // период МА1
extern int MA8Mode      = 0;         // 0-SMA
extern int MA8Price     = 0;         // 0-Close

extern int MA9Period    = 99;        // период МА1
extern int MA9Mode      = 0;         // 0-SMA
extern int MA9Price     = 0;         // 0-Close
extern int Magic        = 123;       // магик
extern double Lots      = 0.1;       // лот

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

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

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price,int c)
  {
   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+Points*c)*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+Points*c)*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);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   int i=0;
   double ma1=iMA(NULL,0,MA1Period,0,MA1Mode,MA1Price,1);
   double ma2=iMA(NULL,0,MA2Period,0,MA2Mode,MA2Price,1);
   double ma3=iMA(NULL,0,MA3Period,0,MA3Mode,MA3Price,1);
   double ma4=iMA(NULL,0,MA4Period,0,MA4Mode,MA4Price,1);
   double ma5=iMA(NULL,0,MA5Period,0,MA5Mode,MA5Price,1);
   double ma6=iMA(NULL,0,MA6Period,0,MA6Mode,MA6Price,1);
   double ma7=iMA(NULL,0,MA7Period,0,MA7Mode,MA7Price,1);
   double ma8=iMA(NULL,0,MA8Period,0,MA8Mode,MA8Price,1);
   double ma9=iMA(NULL,0,MA9Period,0,MA9Mode,MA9Price,1);
   

//---- buy 
   if(Close[1]-ma1>Delta1*Point && Close[1]-ma1<Delta2*Point)
     {
      for(i=0;i<Count;i++)
        {
         PutOrder(0,Ask,i);
        }
     }
//---- sell   
   if(ma1-Close[1]>Delta1*Point && ma1-Close[1]<Delta2*Point)
     {
      for(i=0;i<Count;i++)
        {
         PutOrder(1,Bid,i);
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ClosePos()
  {
   double ma1=iMA(NULL,0,MA1Period,0,MA1Mode,MA1Price,1);

//---
   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)
              {
               if(ma1-Close[1]>Delta1*Point && ma1-Close[1]<Delta2*Point)
                 {
                  if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slip,White))
                     Print("OrderClose error ",GetLastError());
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(Close[1]-ma1>Delta1*Point && Close[1]-ma1<Delta2*Point)
                 {
                  if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slip,White))
                     Print("OrderClose error ",GetLastError());
                 }
              }
           }
        }
     }
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.04.2009                                                     |
//|  Описание : Возвращает флаг разрешения торговли по времени.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    hb - часы времени начала торговли                                       |
//|    mb - минуты времени начала торговли                                     |
//|    he - часы времени окончания торговли                                    |
//|    me - минуты времени окончания торговли                                  |
//+----------------------------------------------------------------------------+
bool isTradeTimeInt(int hb=0,int mb=0,int he=0,int me=0)
  {
   datetime db, de;           // Время начала и окончания работы
   int      hc;               // Часы текущего времени торгового сервера

   db=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)hb+":"+(string)mb);
   de=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)he+":"+(string)me);
   hc=TimeHour(TimeCurrent());

   if(db>=de)
     {
      if(hc>=he) de+=24*60*60; else db-=24*60*60;
     }

   if(TimeCurrent()>=db && TimeCurrent()<=de) return(True);
   else return(False);
  }  
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades()<1 && isTradeTimeInt(StartHour,StartMin,EndHour,EndMin))
     {
      OpenPos();
     }
   else ClosePos();
  }
//+------------------------------------------------------------------+

avatar

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

  • 6 марта 2016, 12:25
+
0
:D  Теперь такой вопросик, для Mode и Price какие цыфры каким варимнтам соответствуют? И для незадействованных машек все параметры ставить по нулям или как:) 
avatar

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

  • 6 марта 2016, 12:31
+
0
Вторую часть вопроса выяснил, первая в процессе… Как то там не по порядку))
avatar

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

  • 6 марта 2016, 12:59
+
+2

ENUM_MA_METHOD
Идентификатор
Значение
Описание
MODE_SMA
0
Простое усреднение
MODE_EMA
1
Экспоненциальное усреднение
MODE_SMMA
2
Сглаженное усреднение
MODE_LWMA
3
Линейно-взвешенное усреднение



ENUM_APPLIED_PRICE
Константа
Значение
Описание
PRICE_CLOSE
0
Цена закрытия
PRICE_OPEN
1
Цена открытия
PRICE_HIGH
2
Максимальная за период цена
PRICE_LOW
3
Минимальная за период цена
PRICE_MEDIAN
4
Медианная цена, (high+low)/2
PRICE_TYPICAL
5
Типичная цена, (high+low+close)/3
PRICE_WEIGHTED
6
Взвешенная цена закрытия, (high+low+close+close)/4
avatar

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

  • 6 марта 2016, 14:58
+
0
Для борьбы с незакрытой частью ордеров сетки, есть предложение добавить в сов. условие:
— Закрывать оставшиеся ордера сетки, если цена развернулась и ушла от крайнего закрытого на Х п.

avatar

  11  preasto Сообщений: 445

  • 6 марта 2016, 18:29
+
0
Как видишь, пока и без твоих идей проблем хватает))
avatar

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

  • 6 марта 2016, 18:53
+
0
То есть чтоб работал как в тех задании не можете сделать*cry*  Предполагалось, что считать должен от закрывшейся свечи за пределами веера до ближайшей машки этого веера. Независимо от того какая из этих машек ближайшая в этот момент
avatar

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

  • 6 марта 2016, 19:00
+
0
Андрей сразу то не обратил внимание на ваши скрины, но как видно сделки открываются внутри веера мувингов, когда должны только за его пределами.

Может быть советник считает дельту от какой то одной машки, а на остальные внимания не обращает?
avatar

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

  • 6 марта 2016, 18:52
+
0
У меня по самому быстрому считает
avatar

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

  • 6 марта 2016, 18:56
+
0
Написал внизу, почему то выше попало. То есть чтоб работал как в тех задании не можете сделать*cry* Предполагалось, что считать должен от закрывшейся свечи за пределами веера до ближайшей машки этого веера. Независимо от того какая из этих машек ближайшая в этот момент
avatar

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

  • 6 марта 2016, 19:02
+
0
Даже логически подумать Андрей, зачем бы я стал просить кучу машек, если считает от какой то одной:) 
avatar

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

  • 6 марта 2016, 19:11
+
0
Сейчас сделал чтобы 7 машек проверял. В середину не влезает.


//+------------------------------------------------------------------+
//|                                                          3MA.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property description "Martin expert advisor"

extern int StopLoss     = 1200;      // лось
extern int TakeProfit   = 1400;      // язь
extern int Delta1       = 100;       // минимальное расстояние от машки до закрытия
extern int Delta2       = 100;       // максимальное расстояние от машки до закрытия
extern int Points       = 100;       // сколько добавляем к тейку
extern int Count        = 5;         // количество ордеров
extern int Slip         = 50;        // реквот

extern int StartHour    = 0;         // час начала торговли
extern int StartMin     = 30;        // минута начала торговли
extern int EndHour      = 23;        // час окончания торговли
extern int EndMin       = 30;        // минута окончания торговли

extern int MA1Period    = 11;        // период МА1
extern int MA1Mode      = 0;         // 0-SMA
extern int MA1Price     = 0;         // 0-Close

extern int MA2Period    = 22;        // период МА1
extern int MA2Mode      = 0;         // 0-SMA
extern int MA2Price     = 0;         // 0-Close

extern int MA3Period    = 33;        // период МА1
extern int MA3Mode      = 0;         // 0-SMA
extern int MA3Price     = 0;         // 0-Close

extern int MA4Period    = 44;        // период МА1
extern int MA4Mode      = 0;         // 0-SMA
extern int MA4Price     = 0;         // 0-Close

extern int MA5Period    = 55;        // период МА1
extern int MA5Mode      = 0;         // 0-SMA
extern int MA5Price     = 0;         // 0-Close

extern int MA6Period    = 66;        // период МА1
extern int MA6Mode      = 0;         // 0-SMA
extern int MA6Price     = 0;         // 0-Close

extern int MA7Period    = 77;        // период МА1
extern int MA7Mode      = 0;         // 0-SMA
extern int MA7Price     = 0;         // 0-Close

extern int MA8Period    = 88;        // период МА1
extern int MA8Mode      = 0;         // 0-SMA
extern int MA8Price     = 0;         // 0-Close

extern int MA9Period    = 99;        // период МА1
extern int MA9Mode      = 0;         // 0-SMA
extern int MA9Price     = 0;         // 0-Close
extern int Magic        = 123;       // магик
extern double Lots      = 0.1;       // лот

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

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

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price,int c)
  {
   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+Points*c)*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+Points*c)*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);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   int i=0;
   double ma1=iMA(NULL,0,MA1Period,0,MA1Mode,MA1Price,1);
   double ma2=iMA(NULL,0,MA2Period,0,MA2Mode,MA2Price,1);
   double ma3=iMA(NULL,0,MA3Period,0,MA3Mode,MA3Price,1);
   double ma4=iMA(NULL,0,MA4Period,0,MA4Mode,MA4Price,1);
   double ma5=iMA(NULL,0,MA5Period,0,MA5Mode,MA5Price,1);
   double ma6=iMA(NULL,0,MA6Period,0,MA6Mode,MA6Price,1);
   double ma7=iMA(NULL,0,MA7Period,0,MA7Mode,MA7Price,1);
   double ma8=iMA(NULL,0,MA8Period,0,MA8Mode,MA8Price,1);
   double ma9=iMA(NULL,0,MA9Period,0,MA9Mode,MA9Price,1);
   

//---- buy 
   if(Close[1]-ma1>Delta1*Point && Close[1]-ma1<Delta2*Point && ma1>ma2 && ma2>ma3 && ma3>ma4 && ma4>ma5 && ma5>ma6 && ma6>ma7)
     {
      for(i=0;i<Count;i++)
        {
         PutOrder(0,Ask,i);
        }
     }
//---- sell   
   if(ma1-Close[1]>Delta1*Point && ma1-Close[1]<Delta2*Point && ma1<ma2 && ma2<ma3 && ma3<ma4 && ma4<ma5 && ma5<ma6 && ma6<ma7)
     {
      for(i=0;i<Count;i++)
        {
         PutOrder(1,Bid,i);
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ClosePos()
  {
   double ma1=iMA(NULL,0,MA1Period,0,MA1Mode,MA1Price,1);

//---
   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)
              {
               if(ma1-Close[1]>Delta1*Point && ma1-Close[1]<Delta2*Point)
                 {
                  if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slip,White))
                     Print("OrderClose error ",GetLastError());
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(Close[1]-ma1>Delta1*Point && Close[1]-ma1<Delta2*Point)
                 {
                  if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slip,White))
                     Print("OrderClose error ",GetLastError());
                 }
              }
           }
        }
     }
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.04.2009                                                     |
//|  Описание : Возвращает флаг разрешения торговли по времени.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    hb - часы времени начала торговли                                       |
//|    mb - минуты времени начала торговли                                     |
//|    he - часы времени окончания торговли                                    |
//|    me - минуты времени окончания торговли                                  |
//+----------------------------------------------------------------------------+
bool isTradeTimeInt(int hb=0,int mb=0,int he=0,int me=0)
  {
   datetime db, de;           // Время начала и окончания работы
   int      hc;               // Часы текущего времени торгового сервера

   db=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)hb+":"+(string)mb);
   de=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)he+":"+(string)me);
   hc=TimeHour(TimeCurrent());

   if(db>=de)
     {
      if(hc>=he) de+=24*60*60; else db-=24*60*60;
     }

   if(TimeCurrent()>=db && TimeCurrent()<=de) return(True);
   else return(False);
  }  
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades()<1 && isTradeTimeInt(StartHour,StartMin,EndHour,EndMin))
     {
      OpenPos();
     }
   else ClosePos();
  }
//+------------------------------------------------------------------+

avatar

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

  • 6 марта 2016, 19:13
+
0
Семи выше крыши)) А так и предполагал потом максимум столько, 10 для запаса называл:)  Щас будем проверять
avatar

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

  • 6 марта 2016, 19:20
+
0
Я, вот, проверяю: перевода в БУ и трала явно не хватает.
Хотя бы в БУ — много ордеров к-е открываясь м.б. закрыты в БУ, но разворачиваются, или сразу идут против тренда на отскоках — могут быть в БУ+ закрыты без СЛ.
avatar

  11  preasto Сообщений: 445

  • 6 марта 2016, 19:24
+
0
На каком то участке истории может и так, на другом этот безубыток боком может выйти. Это дело такое…
avatar

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

  • 6 марта 2016, 19:26
+
0
Не проверив — не узнаешь. *yes* 
avatar

  11  preasto Сообщений: 445

  • 6 марта 2016, 19:58
+
0
Андрей не знаю как у вас, у меня щас даже не четырёх машках ордеров не открывает
avatar

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

  • 6 марта 2016, 19:31
+
0
И раз уж он будет обрабатывать до семи штук, лишние две можно из кода убрать:) 
avatar

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

  • 6 марта 2016, 19:32
+
0
Подозреваю что вы уже там материтесь, но я честное слово не виноват;) 
avatar

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

  • 6 марта 2016, 19:37
+
0
Вот, только одну сделку за неделю открыл и не понятно по какому принципу (дельту ставил от 100 до 400)

avatar

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

  • 6 марта 2016, 19:58
+
0
Причём закрыл он её с минусом 300 пунктов, когда лось в настройках 1200))
avatar

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

  • 6 марта 2016, 20:01
+
0
Вот, только одну сделку за неделю открыл и не понятно по какому принципу (дельту ставил от 100 до 400)


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

avatar

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

  • 6 марта 2016, 22:17
+
0
Тест с теми же настройками но отключёнными двумя последними машками

1. Покупка по сигналу
2. Тейкпрофит пятого ордера
3. Максимальная цена после открытия позиций, которая пересекла все пять тейкпрофитов
4. Первая свеча закрытая с противоположной стороны (сигнал для закрытия старых ордеров, если такие были. И одновременная продажа)


По правилам системы после первой покупки все ордера закрылись бы по тейку, а на свече (4) была бы продажа. Вместо этого советник после первой покупки зарыл всё с убытком под третьей машкой, позже снова купил и опять закрыл не там где надо
avatar

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

  • 7 марта 2016, 09:44
+
0
У меня закрытие старое осталось, поправлю.
avatar

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

  • 7 марта 2016, 09:50
+
0
Имеете в виду только три машки проверяет?:) 
avatar

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

  • 7 марта 2016, 09:53
+
0
Сделать закрытие по противоположному сигналу или просто 3 машки в ряд?
avatar

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

  • 7 марта 2016, 09:59
+
0
Конечно же по противоположному сигналу. Противоположный сигнал, когда свеча закрывается с обратной стороны от ВСЕХ машек. Независимо сколько их, одна или все семь)
avatar

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

  • 7 марта 2016, 10:02
+
0
То есть сигнал для закрытия, это закрытие свечи с другой стороны. Для этого не обязательно цене быть в пределах диапазона. Достаточно закрытия. А вот если цена в диапазоне, помимо закрытия открываются новые ордера. Так как это был сигнал на покупку или продажу
avatar

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

  • 7 марта 2016, 10:04
+
0
Посмотрите:


//+------------------------------------------------------------------+
//|                                                          3MA.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property description "Martin expert advisor"

extern int StopLoss     = 1200;      // лось
extern int TakeProfit   = 1400;      // язь
extern int Delta1       = 100;       // минимальное расстояние от машки до закрытия
extern int Delta2       = 100;       // максимальное расстояние от машки до закрытия
extern int Points       = 100;       // сколько добавляем к тейку
extern int Count        = 5;         // количество ордеров
extern int Slip         = 50;        // реквот

extern int StartHour    = 0;         // час начала торговли
extern int StartMin     = 30;        // минута начала торговли
extern int EndHour      = 23;        // час окончания торговли
extern int EndMin       = 30;        // минута окончания торговли

extern int MA1Period    = 11;        // период МА1
extern int MA1Mode      = 0;         // 0-SMA
extern int MA1Price     = 0;         // 0-Close

extern int MA2Period    = 22;        // период МА1
extern int MA2Mode      = 0;         // 0-SMA
extern int MA2Price     = 0;         // 0-Close

extern int MA3Period    = 33;        // период МА1
extern int MA3Mode      = 0;         // 0-SMA
extern int MA3Price     = 0;         // 0-Close

extern int MA4Period    = 44;        // период МА1
extern int MA4Mode      = 0;         // 0-SMA
extern int MA4Price     = 0;         // 0-Close

extern int MA5Period    = 55;        // период МА1
extern int MA5Mode      = 0;         // 0-SMA
extern int MA5Price     = 0;         // 0-Close

extern int MA6Period    = 66;        // период МА1
extern int MA6Mode      = 0;         // 0-SMA
extern int MA6Price     = 0;         // 0-Close

extern int MA7Period    = 77;        // период МА1
extern int MA7Mode      = 0;         // 0-SMA
extern int MA7Price     = 0;         // 0-Close

extern int MA8Period    = 88;        // период МА1
extern int MA8Mode      = 0;         // 0-SMA
extern int MA8Price     = 0;         // 0-Close

extern int MA9Period    = 99;        // период МА1
extern int MA9Mode      = 0;         // 0-SMA
extern int MA9Price     = 0;         // 0-Close
extern int Magic        = 123;       // магик
extern double Lots      = 0.1;       // лот

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

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

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price,int c)
  {
   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+Points*c)*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+Points*c)*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);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   int i=0;
   double ma1=iMA(NULL,0,MA1Period,0,MA1Mode,MA1Price,1);
   double ma2=iMA(NULL,0,MA2Period,0,MA2Mode,MA2Price,1);
   double ma3=iMA(NULL,0,MA3Period,0,MA3Mode,MA3Price,1);
   double ma4=iMA(NULL,0,MA4Period,0,MA4Mode,MA4Price,1);
   double ma5=iMA(NULL,0,MA5Period,0,MA5Mode,MA5Price,1);
   double ma6=iMA(NULL,0,MA6Period,0,MA6Mode,MA6Price,1);
   double ma7=iMA(NULL,0,MA7Period,0,MA7Mode,MA7Price,1);
   double ma8=iMA(NULL,0,MA8Period,0,MA8Mode,MA8Price,1);
   double ma9=iMA(NULL,0,MA9Period,0,MA9Mode,MA9Price,1);
   

//---- buy 
   if(Close[1]-ma1>Delta1*Point && Close[1]-ma1<Delta2*Point && ma1>ma2 && ma2>ma3 && ma3>ma4 && ma4>ma5 && ma5>ma6 && ma6>ma7)
     {
      for(i=0;i<Count;i++)
        {
         PutOrder(0,Ask,i);
        }
     }
//---- sell   
   if(ma1-Close[1]>Delta1*Point && ma1-Close[1]<Delta2*Point && ma1<ma2 && ma2<ma3 && ma3<ma4 && ma4<ma5 && ma5<ma6 && ma6<ma7)
     {
      for(i=0;i<Count;i++)
        {
         PutOrder(1,Bid,i);
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ClosePos()
  {
   double ma1=iMA(NULL,0,MA1Period,0,MA1Mode,MA1Price,1);
   double ma2=iMA(NULL,0,MA2Period,0,MA2Mode,MA2Price,1);
   double ma3=iMA(NULL,0,MA3Period,0,MA3Mode,MA3Price,1);
   double ma4=iMA(NULL,0,MA4Period,0,MA4Mode,MA4Price,1);
//---
   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)
              {
               if(ma1-Close[1]>Delta1*Point && ma1-Close[1]<Delta2*Point && ma1<ma2 && ma2<ma3 && ma3<ma4)
                 {
                  if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slip,White))
                     Print("OrderClose error ",GetLastError());
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(Close[1]-ma1>Delta1*Point && Close[1]-ma1<Delta2*Point && ma1>ma2 && ma2>ma3 && ma3>ma4)
                 {
                  if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slip,White))
                     Print("OrderClose error ",GetLastError());
                 }
              }
           }
        }
     }
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.04.2009                                                     |
//|  Описание : Возвращает флаг разрешения торговли по времени.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    hb - часы времени начала торговли                                       |
//|    mb - минуты времени начала торговли                                     |
//|    he - часы времени окончания торговли                                    |
//|    me - минуты времени окончания торговли                                  |
//+----------------------------------------------------------------------------+
bool isTradeTimeInt(int hb=0,int mb=0,int he=0,int me=0)
  {
   datetime db, de;           // Время начала и окончания работы
   int      hc;               // Часы текущего времени торгового сервера

   db=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)hb+":"+(string)mb);
   de=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)he+":"+(string)me);
   hc=TimeHour(TimeCurrent());

   if(db>=de)
     {
      if(hc>=he) de+=24*60*60; else db-=24*60*60;
     }

   if(TimeCurrent()>=db && TimeCurrent()<=de) return(True);
   else return(False);
  }  
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades()<1 && isTradeTimeInt(StartHour,StartMin,EndHour,EndMin))
     {
      OpenPos();
     }
   else ClosePos();
  }
//+------------------------------------------------------------------+

avatar

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

  • 7 марта 2016, 10:06
+
0
Не совсем то) После того как был закрыт с прибылью пятый ордер, сов новую партию открыл. Похоже я в техзадании этого не учёл, но для открытия ордеров того же направления что и предыдущие должны быть соблюдены два условия.

1) Все старые ордера были закрыты (на примере этого скрина условие было выполнено)
2) Цена успела вернуться внутрь веера либо побывала с противоположной стороны, после чего снова вышла из веера со стороны последнего сигнала и если произошли условия для входа, он осуществляется
Редактирован: 7 марта 2016, 12:14
avatar

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

  • 7 марта 2016, 10:28
+
0
Пожалуй мой первый маленький косяк за весь топик:) 
avatar

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

  • 7 марта 2016, 10:31
комментарий был удален 2016-03-07 12:07:50 Kashtan

комментарий был удален 2016-03-07 12:08:17 Kashtan

+
0
Пример:
avatar

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

  • 7 марта 2016, 11:50
+
0
Пример для одного ордера с Т.П. 300 пунктов
avatar

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

  • 7 марта 2016, 12:42
+
0
Сейчас стоит условие на открытие 3 машки в ряд плюс дельта, так как у вас на скрине никак не получится.
Редактирован: 7 марта 2016, 12:53
avatar

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

  • 7 марта 2016, 12:47
+
0
Везде где на моём скрине покупка или продажа, расстояние от входа до ближайшей машки больше ста пунктов. Я так понял что вы понимаете как предполагается торговать по этой системе в ручном режиме, но сложно запрограмировать чтоб советник делал так же?
avatar

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

  • 7 марта 2016, 12:51
+
0
Нужно писать дополнительную функцию, которая будет проверять какая машка сейчас выше всех и от нее считать расстояние. А сейчас условие 3 крайних машки выстроились в ряд.
avatar

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

  • 7 марта 2016, 12:57
+
0
Возможно ли сделать, чтоб хотя бы с четырьмя машками работал так? мне пока только четыре и надо
avatar

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

  • 7 марта 2016, 12:54
+
0
Нужны четкие условия для входа. Опишите их максимально подробно, а то это все уже слишком затянулось.
avatar

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

  • 7 марта 2016, 12:58
+
0
Так примерно будет на словах?

1. Входы: цена закрылась выше ниже самой крайней машки из веера плюс дельта.
2. выходы: цена закрылась выше ниже крайней машки из веера без дельты.
avatar

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

  • 7 марта 2016, 13:16
+
0
Условия для покупок:

Основные:

1) Нет ни одного открытого ордера
2) Цена закрывшейся свечи выше всех четырёх машек
3) Советником была выявлена машка расположенная выше трёх остальных и расстояние от неё до цены находится в пределах заданного диапазона (то есть если на эту свечку наложить вертикальную линию, расстояние должно вычисляться от места пересечения линии с машкой до текущей цены.
Дополнительные:
1) Если последний ордер был тоже на покупку и закрыт по тейкпрофиту, в интервале между его закрытием и новым сигналом должна была быть закрыта хотя бы одна свеча ниже хотя бы одной из машек.
2) Если последний ордер был тоже на покупку и закрыт либо по тейку либо при обратоном пробое машек с закрытием ниже их хотя бы одной свечки (просто пробоя не достаточно), соответсвенно этот обратный пробой был не достаточно большим для сигнала на продажу, а значит дополнительное условие «1)» было выполненно автоматически. В том числе этот обратный пробой является вторым условием для выхода из покупок: 1) Сработал тейкпрофит. 2) произошёл обратный пробой.

Условия для продаж:
Основные:
1) Нет ни одного открытого ордера
2) Цена закрывшейся свечи ниже всех четырёх машек
3) Советником была выявлена машка расположенная ниже трёх остальных и расстояние от неё до цены находится в пределах заданного диапазона (то есть если на эту свечку наложить вертикальную линию, расстояние должно вычисляться от места пересечения линии с машкой до текущей цены.
Дополнительные:
1) Если последний ордер был тоже на продажу и закрыт по тейкпрофиту, в интервале между его закрытием и новым сигналом должна была быть закрыта хотя бы одна свеча выше хотя бы одной из машек.
2) Если последний ордер был тоже на продажу и закрыт либо по тейку либо при обратоном пробое машек с закрытием выше их хотя бы одной свечки (просто пробоя не достаточно), соответсвенно этот обратный пробой был не достаточно большим для сигнала на покупку, а значит дополнительное условие «1)» было выполненно автоматически. В том числе этот обратный пробой является вторым условием для выхода из продаж: 1) Сработал тейкпрофит. 2) произошёл обратный пробой.
Как ещё лучше объяснить, пока не придумал) Надеюсь этого окажется достаточным.

Кроме этого понял необходимость добавить безубыток для части ордеров. А именно возможность задавать в настройках, после какого количества ордеров закрытых по тейкпрофиту, остальные перевести в безубыток. Пример: В настройках задано открытие пяти ордеров. Параметр для безубытка поставили 2. Это значит что когда первые два ордера закроются по тейкпрофиту, остальные три переводятся в безубыток. Надеюсь Андрей это не сложно:) 
avatar

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

  • 7 марта 2016, 14:10
+
0
Примечание: Основные условия актуальны независимо от того когда был запущен советник. Дополнительные — для ордеров открытых при последнем сигнале.
avatar

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

  • 7 марта 2016, 14:25
комментарий был удален 2016-03-07 14:34:44 Kashtan

+
0
Нет сложно все это и так уже сколько провозился. Обращайтесь к платному.
avatar

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

  • 7 марта 2016, 14:46
+
0
А можно хотя бы в следующем месяце доделать?*cry* 
avatar

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

  • 7 марта 2016, 14:48
+
0
Сделаю новый топик по доработке советника
avatar

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

  • 7 марта 2016, 14:49
+
0
А вы к тому времени если что между делом потихоньку доделаете и как топик создам, сразу готовый результат)
avatar

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

  • 7 марта 2016, 14:55
+
0
Обидно будет, если столько оба провозились и за зря(
avatar

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

  • 7 марта 2016, 14:57
+
0
Если реально технически тяжело — тогда конечно вопросов нет<img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' :) '>&nbsp; 
Редактирован: 7 марта 2016, 15:09
avatar

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

  • 7 марта 2016, 15:01
+
0
Когда есть простенькое условие на вход и выход плюс еще 1-2 небольшие доработки, тогда еще можно делать, а то ТЗ которое вы последним написали, у вас наверное фантазия богатая :) 
avatar

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

  • 7 марта 2016, 16:31
+
+1
1. Входы: цена закрылась выше ниже самой крайней машки из веера плюс дельта.
2. выходы: цена закрылась выше ниже крайней машки из веера без дельты.


Например по таким условиям, будет следующий советник:



avatar

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

  • 7 марта 2016, 17:25
+
0
Ха-ха фантазия у меня богатая:)  Вы попросили описать максимально чётко условия для входов! Вот я сделал всё как на моём последнем скрине.
avatar

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

  • 7 марта 2016, 17:58
+
0
К тому простому ТЗ, которое я набросал еще можно что то добавлять, а все то что в последнем варианте это много.
Редактирован: 7 марта 2016, 18:04
avatar

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

  • 7 марта 2016, 18:02
+
0
Я пытался описать ни столько то что советник должен делать, сколько то чего НЕ должен))
avatar

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

  • 7 марта 2016, 18:01
+
0
Понятно, а мне оно показалось более простым, чем моё начальное:)  Вот я и подумал что если до этого ничего не получалось, то и по такому простому тем более не выдет. Судя по вашему последнему скрину всё работает как положено)
avatar

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

  • 7 марта 2016, 18:04
+
0
Внутри машек насколько видно ничего не открывается и не закрывается. Это собственно и требовалось)
avatar

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

  • 7 марта 2016, 18:06
+
0
avatar

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

  • 7 марта 2016, 18:08
+
0
Ой*fool*  пожалуй я поторопился с выводами
avatar

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

  • 7 марта 2016, 18:10
+
0
это я не поповоду «обновил» Ещё не успел проверить:D 
avatar

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

  • 7 марта 2016, 18:11
+
0
Как видим


А должен был повторно купить в том случае если бы цена побывала внутри машек и снова закрылась выше всех машек с учётом дельты
avatar

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

  • 7 марта 2016, 20:01
комментарий был удален 2016-03-07 20:36:41 Kashtan

+
0
Выходит что намного проще запрограмировать выполнение входа по противоположному сигналу, чем правильный вход в том же направлении после отработки последнего сигнала(
avatar

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

  • 7 марта 2016, 20:07
комментарий был удален 2016-03-07 20:36:09 Kashtan

+
0
А должен был повторно купить в том случае если бы цена побывала внутри машек и снова закрылась выше всех машек с учётом дельты


У меня еще нет этого условия только это:

1. Входы: цена закрылась выше ниже самой крайней машки из веера плюс дельта.
2. выходы: цена закрылась выше ниже крайней машки из веера без дельты.
avatar

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

  • 7 марта 2016, 20:42
+
0
Понятно. В общем доделывать или нет на ваше усмотрение. Если не тяжело, просто по времени возится, можно в следующий топик перенести. Если совсем туго, закругляемся<img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' :) '>&nbsp; 
Редактирован: 7 марта 2016, 20:50
avatar

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

  • 7 марта 2016, 20:50
+
0
А должен был повторно купить в том случае если бы цена побывала внутри машек и снова закрылась выше всех машек с учётом дельты

Интересно было посмотреть реализацию условия
avatar

  16  cerber04 Сообщений: 409

  • 7 марта 2016, 22:38
+
+1
А что тут смотреть) Если был сигнал на покупку и все ордера закрылись по тейкпрофиту, советник начинает следить за тем, закрылась ли очередная свеча ниже хотя бы одной из машек. Если это произошло, он снова готов к сигналу на покупку, и на продажу естественно тоже. Похоже запрограммировать это не так просто, как на словах…
Редактирован: 7 марта 2016, 22:51
avatar

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

  • 7 марта 2016, 22:49
+
0
Как посмотришь на то, что даже самому Андрею бывает тяжело справиться с такими на первый взгляд не сложными задачами, пропадает всё желание пытаться учить MQL
avatar

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

  • 7 марта 2016, 22:55
+
0
Завтра посмотрю как сделать свеча закрылась за машками.
avatar

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

  • 7 марта 2016, 23:02
+
0
Похоже для выполнения этого условия советник не просто должен открывать сделки по сигналу, а фиксировать как то в памяти в каком направлении был этот сигнал и в том случае если все ордера были по тейку закрыты, действовать согласно этому
Если был сигнал на покупку и все ордера закрылись по тейкпрофиту, советник начинает следить за тем, закрылась ли очередная свеча ниже хотя бы одной из машек. Если это произошло, он снова готов к сигналу на покупку

Наверно на самом деле это не легко сделать
avatar

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

  • 7 марта 2016, 23:05
+
0
Ага! Спокойной ночи:) 
avatar

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

  • 7 марта 2016, 23:05
+
0
Добавил условие: www.opentraders.ru/downloads/1085/

avatar

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

  • 7 марта 2016, 23:28
+
0
Браво Андрей! Похоже остались последние штрихи…
Для наглядности сделал два варианта прогона: 1) Четыре машки и один ордер с т.п. 2)То же самое, только ордер без тейка.

В первом случае сов сразу открыл покупку, и все последующие покупки были по правилам. Но при обратном сигнале не продаёт


Во втором случае он не только не продаёт, но и не закрывает покупку (хоть с дельтой хоть без) Закрыл только в конце теста


На первом скрине тоже видно что последняя покупка должна была закрыться с убытком, но позже закрылась с профитом
Редактирован: 8 марта 2016, 13:55
avatar

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

  • 8 марта 2016, 09:50
комментарий был удален 2016-03-10 20:17:08 Kashtan

+
+2
Чувствуется мы этот топик надолго запомним


У меня только один вопрос, зачем вам такой советник? Вы хоть сто машек добавьте, все ровно будут запаздывать, значит входы будут запоздалые, значит будут убытки и слив депозита.
avatar

  14  beton2011 Сообщений: 895

  • 8 марта 2016, 10:27
комментарий был удален 2016-03-10 20:16:49 Kashtan

+
0
Это все понятно, конечно надо что то искать. Я вам только посоветовал, сам когда то увлекался машками, но так и ничего толком не получилось. Потом только понял что и не должно получатся, так как машки идут за ценой, а не наоборот, как некоторые думают.
avatar

  14  beton2011 Сообщений: 895

  • 8 марта 2016, 11:19
комментарий был удален 2016-03-10 20:16:16 Kashtan

+
0
А вот тут закрывает, но не там где надо


На вашем последнем скрине тоже такое есть. Но до этого вы писали что семь машек проверяет, а там девять. Подумал что из-за этого. Как видим с четырьмя тоже не всё хорошо.
avatar

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

  • 9 марта 2016, 10:46
+
0
Доделка в следующем месяце?
avatar

  7  Lexx79 Сообщений: 40

  • 12 марта 2016, 14:33
+
0
Доделка в следующем месяце?

В точности по ТЗ не получилось. Есть только промежуточные варианты.
avatar

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

  • 12 марта 2016, 17:51
+
0
Как добавить в советник следующее условие: Открывать на пересечение машек и после чего должен закрыться 5 свеча за пределами машки. Спасибо
avatar

  10  Nadejda-stav Сообщений: 157

  • 24 августа 2016, 10:10

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