0
Андрей, добавьте пожалуйста вариант расчета лота используя данные индикатора:
<code>//+------------------------------------------------------------------+
//|                                                     Fractals.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
#property indicator_type1   DRAW_ARROW
#property indicator_type2   DRAW_ARROW
#property indicator_color1  Gray
#property indicator_color2  Gray
#property indicator_label1  "Fractal Up"
#property indicator_label2  "Fractal Down"
//---- indicator buffers
double ExtUpperBuffer[];
double ExtLowerBuffer[];
//--- 10 pixels upper from high price
int    ExtArrowShift=-10;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtLowerBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_ARROW,217);
   PlotIndexSetInteger(1,PLOT_ARROW,218);
//---- arrow shifts when drawing
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ExtArrowShift);
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-ExtArrowShift);
//---- sets drawing line empty value--
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- initialization done
  }
//+------------------------------------------------------------------+
//|  Accelerator/Decelerator Oscillator                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,const int prev_calculated,
                const datetime &Time[],
                const double &Open[],
                const double &High[],
                const double &Low[],
                const double &Close[],
                const long &TickVolume[],
                const long &Volume[],
                const int &Spread[])
  {
   int i,limit;
//---
   if(rates_total<5)
      return(0);
//---
   if(prev_calculated<7)
     {
      limit=2;
      //--- clean up arrays
      ArrayInitialize(ExtUpperBuffer,EMPTY_VALUE);
      ArrayInitialize(ExtLowerBuffer,EMPTY_VALUE);
     }
   else limit=rates_total-5;

   for(i=limit;i<rates_total-3 && !IsStopped();i++)
     {
      //---- Upper Fractal
      if(High[i]>High[i+1] && High[i]>High[i+2] && High[i]>=High[i-1] && High[i]>=High[i-2])
         ExtUpperBuffer[i]=High[i];
      else ExtUpperBuffer[i]=EMPTY_VALUE;

      //---- Lower Fractal
      if(Low[i]<Low[i+1] && Low[i]<Low[i+2] && Low[i]<=Low[i-1] && Low[i]<=Low[i-2])
         ExtLowerBuffer[i]=Low[i];
      else ExtLowerBuffer[i]=EMPTY_VALUE;
     }
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }

//+------------------------------------------------------------------+</code>

Наверное надо сравнить разницу между (бид — нижний фрактал) и (верхний фрактал — бид), а в расчете использовать большую разницу.Тогда величина лота все таки будет меньше чем сейчас, во всяком случае не больше, значит и залог нужен будет меньше.
И ещё, может быть есть смысл перенести код индикатора в код советника.
Если нужно могу оформить как заказ.
avatar

ssg

  • 9 мая 2022, 13:16
0
Андрей, добрый день.С Днем Победы!
Наверное имеется ввиду следущее:
лот = указанная сумма/|(бид-ближайший фрактал)|;
или
лот = указанная сумма/|(бид-(хай1 или лоу1 по ситуации))|;
avatar

ssg

  • 9 мая 2022, 11:02
0
Балдею я от сибиряков. Все время стремятся чем либо померятся.

Да нет, вы не правы.Просто, я считаю, нужно всегда аргументированно отстаивать своё мнение и свою позицию.
Ладно, проехали.
С Днем Победы, Одесса!!!
avatar

ssg

  • 9 мая 2022, 04:37
0
Все эти понятия, термины и теорию и изучал лет 18-20 назад торгуя на площадке ФорексКлуба и когда начал писать первые программы на Румосе, был такой язык у ФорексКлуба. Когда торговали и обучали, ныне уже ставшие легендой Тартан, Парамон и другие. Так, что рассказывать мне что такое трал и т.д. мне не надо.
Тем более в советнике я сам прописал трал средств.
Если вы все время говорите о возможности хода цены не туда куда надо, то как вы планируете зарабатывать?

а вы отрицаете такую возможность?
И еще, мне кажется, что вы не до конца поняли стратегию защиты ценового канала. Хотя, может вы трудитесь над другой стратегией. До конца не понял.

Если есть желание погоняйте советник в тестере, используйте разные методы закрытия и их комбинации. Используйте визуализации и анализ логов. Запустите на демосчете. Недели хватит что бы понять стратегию и работу советника. Ну это если будет желание. Вот тогда и и сможете дать адекватную оценку стратегии и советнику.
Рекомендую приглядеться к стратегии закрытия двух позиций с самыми большими лотами при достижении некоторой прибыли. По определению это будет одна позиция на покупку и одна позиция на продажу.
И прибыль фиксируете, и часть позиций закрываете, и нагрузку на депозит уменьшаете и маржу освобождаете для открытия других позиций.
И ещё в тестере заложите депозит не более 1000 единиц. Это и реальная сумма для торговли и естественное орграничения размера лотов. Слишком большой лот открыть не даст ограничение по залогу.
avatar

ssg

  • 8 мая 2022, 20:51
0
То, что должна быть разница между стопами позиций одного направления и БУ позиций другого направления — это понятно. Вопрос какой она должна в таком случае быть. Сделаешь большой — получишь дополнительный суммарный убыток при откате и закрытии по БУ. Сделаешь маленькой — получишь минимальную суммарную прибыль.
НО ТУТ УЖ САМОМУ РЕШАТЬ ЧТО ВАЖНЕЕ. ДЕПОЗИТ СОХРАНЯТЬ ИЛИ БАБЛО РУБИТЬ.

Одни приходят на форекс работать, а другие зарабатывать.
Не проще ли тогда ничего не делать и тогда гарантированно СОХРАНИТЕ ДЕПОЗИТ.
И еще, Вы не пробовали тралить просто какую-то цену? Не цену SL ордера, а, например, цену БУ группы ордеров. В чем разница?

Попробуйте. Много интересного.

Произведение суммарного лота и количества пунктов между текущей ценой и цены в точке БУ = прибыль. Соответственно трал средств в советнике отвечает вашему предложению.
А на счет другого алгоритма расчета лотов все просто.

В данном советнике уже реализованы несколько вариантов манипуляций как с числом позиций так и с размерами лотов этих позиций.Достаточно прочитать ком-рии в настройках и прогнать советник в тестере в режиме визуализации и затем посмотреть логи.
avatar

ssg

  • 8 мая 2022, 15:33
0
В данном советнике присутствуют 6 различных вариантов закрытия позиций взятых из моего другого советника.
Использование стоплосса каждой позиции здесь давно пройденный этап.
В сеточных советниках таких стратегий выставлять индивидуальный стоплосс каждой паре не считаю целесообразным. У всех позиций одного направления цены открытия позиций находятся на одной цене и их стоплоссы находятся на одной цене. При закрытии позиций по стоплоссу резко возрастает значение общего профита по советнику и сразу закрываются позиции с положительными значениями прибыли.
Если вместо закрытия позиций с положительными значениями по общему профиту применить трал этих позиций нужна точка отсчета трала, а она не известна т.к. мы не можем знать куда пойдет цена.
Получается — часть позиций закрылась по стопу, мы приняли убыток и отдали свои деньги брокеру.Дальше ждем что цена будет двигаться в нужную сторону и закроемся с хорошим профитом.а цена развернулась и идет в другую стороны и мы имеем возрастающий убыток всем суммарным лотом.
И что тогда делать? Закрыться с двойным убытком? Мечтать о очередном развороте цены?
Следовательно пока открыты разнонаправленные позиции возможно некоторое хеджирование и прибыли и убытка.
И еще, если начнет прижимать просадка по свободным бабулям, посмотрите у меня на блоге еще один вариант расчета ордеров.

можете дать расчет?
avatar

ssg

  • 7 мая 2022, 14:52
0
Сам советник: cloud.mail.ru/public/sQCh/WFqNPMJvY
Советник торговал на демосчете две недели — «полет нормальный».
Итоги не привожу, т.к. торговля шла у моего брокера и с моими настройками.
Тестируйте и торгуйте сами, тогда Вы будете иметь своё личное мнение не подверженное чужим высказываниям.
avatar

ssg

  • 6 мая 2022, 12:38
0
Настройки:


//-------------------------------------------------------------------
extern string s_1       = " Закрывать дальнюю убыточную и положительные при достижении суммарного профита CloseProfit";
extern bool   Close_1   = false;
enum tt
{
   tr2=0,    //по текущей валюте
   tr1=1,    //по всем символам
};
extern double CloseProfit = 10;    // Закрывать по суммарному профиту в валюте;
input tt      Symbоl     = 1;      // Суммируем профит

extern string s_2        = " Закрывать и удалять всё  при достижении суммарного профита Profits или Loss";
extern bool   Close_2    = false;
extern double Loss       = 2000;   // Loss убыток в валюте если 0 то не используется
extern double Profits    = 0;      // Profits профит в валюте 0 то не используется

extern string s_3        = " Закрывать 2 позиции с максимальным лотами  при достижении суммарного профита profits или Los";
extern bool   Close_3    = false;
extern double loss       = 2000;   // loss убыток в валюте если 0 то не используется
extern double profits    = 0;      // profits профит в валюте 0 то не используется

extern string s_4        = " Закрывать и удалять всё при открытии более чем N позиций и достижении суммарного профита рrof ";
extern bool   Close_4    = false;
extern double prof       = 10;     // profits профит в валюте 0 то не используется
extern int    N          = 3;      // Максимальное кол-во открытых позиций 

extern string s_5        = " Закрывать нескольско последних позиций при  открытии более чем Partpos позиций и достижении по ним суммарного профита Prof ";
extern bool   Close_5    = false;
extern int    Partpos    = 3;       // число поз после которого происходит для закрытия части позиций
extern double Prof       = 10;      // Prof профит  части позиций в валюте для их последующего закрытия 

extern double Lot        = 0.01;   // Стартовый лот 
extern bool   easy       = true;   // Использовать легкий вариант рассчета последующих лотов
extern int    delta      = 150;    // Расстояние до стоп ордера от крайней позиции
extern bool   Tral       = false;  // Использовать трал средств
extern int    EqvTralStep= 80;     // Шаг трала по Эквити счета в валюте депозита
extern int    Slip       = 30;     // Проскальзывание
extern int    Magic      = 123;    // Магик
avatar

ssg

  • 6 мая 2022, 12:25
0
Есенин-это Россия, это Россия!
Серега Еенин тебя имел и имеет, в извращенной форме!!!
Он то Сергей Есенин, а «вы то» дерьмо!
avatar

ssg

  • 20 апреля 2022, 18:38
0
1.Вы бы сначала поглядели кто Вам первый код написал.
2.Вы бы сначала свою фразу перечитали:
Хотелось бы советника кинуть на торгуемые инструменты и забыть, зная что при открытии ордера и выставлении стопа он отработает сейф. Не заморачиваться с магиками и какую часть закрывать.

3.А уже потом бы делали замечания. С уважением.*hi* 
avatar

ssg

  • 18 апреля 2022, 20:18
0
Рассмотрите такой вариант:
На счете торгуют 2 советника по двум разным инструментам.
Вы решили применить этот советник только для одной пары.
Что будете делать?
А если на счете 7 советников и три из них мультивалютные" тогда что?
avatar

ssg

  • 18 апреля 2022, 19:53
0
Немного образно: содержимое коробок разное.Или размеры коробок разные.А по штукам — да, все верно.
avatar

ssg

  • 16 апреля 2022, 15:30
+1
Кроме того, что будет меняться ситуация с экономикой в Америке, еще и будет независимо друг от друга меняться ситуация в Европе и Англии. Следовательно Ваше утверждение
Eurusd-Gbpusd.В это связки всегда будет положительная корреляция.

не верно т.к. нет жёсткой привязки экономики этих стран друг к другу.
Опять же при данной стратегии важно не только существование положительной корреляции, но и относительная величина этой корреляции валют между собой в достаточно длительном времени.
avatar

ssg

  • 16 апреля 2022, 12:48
0
Однозначно сказать нельзя.Корреляция это всегда вещь временная.Зависит и от экономики стран, и от внешней политика и… Но правда достаточно высокая корреляция может сохраняться долго.Например отношение евро/франк = 1.2 сохранялась более 20 лет.
Сегодня наверное я бы смотрел связь сырьевых валют cad,aud,nzd к usd и jpy.
Наверное можно смотреть Европу eur и chf, им там всем не весело и у всех «бардак».
Традиционно смотрят криптовалюту. Признаки по которым можно смотреть пары у всех разные.
avatar

ssg

  • 16 апреля 2022, 04:56
0
1.Открыть два графика.
2.Взять единую точку отсчета (например 1 апреля).
3.Виртуально открыть по позиции на каждом графике.
4.С карандашом в руках считать разницу в пунктах, скажем каждые четыре часа.
Всего будет 180 баров.Всё это свести в таблицу.
5.Есть другой вариант — написать индикатор.;) 
avatar

ssg

  • 16 апреля 2022, 04:16
0
Я еще обычно делаю простую проверку на корреляцию между парами такой функцией:


extern string   a4         = "входные параметры индикатора корреляции";
extern ENUM_TIMEFRAMES Tf = PERIOD_H1; // таймфрейм 
extern int    Correl_Period  = 14; 
extern double MinCor         = 0.50;  
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
 double Correl(string base,string hedge,int shift)
   {
   shift=0;
   double u1=0,l1=0,s_1=0;
   int base_bn=iBarShift(base,0,Time[shift],false);
   int hedge_bn=iBarShift(hedge,0,Time[shift],false);   
   
      for(int i = Correl_Period - 1; i >= 0; i--){
         u1 +=(iClose(base,Tf,base_bn+i)-iMA(base,Tf,Correl_Period,0,MODE_SMA,PRICE_CLOSE,base_bn+i))* 
              (iClose(hedge,Tf,hedge_bn+i)-iMA(hedge,Tf,Correl_Period,0,MODE_SMA,PRICE_CLOSE,hedge_bn+i));
         l1 += MathPow(iClose(base,Tf,base_bn+i)-iMA(base,Tf,Correl_Period,0,MODE_SMA,PRICE_CLOSE,base_bn+i),2);
         s_1 += MathPow(iClose(hedge,Tf,hedge_bn+i)-iMA(hedge,Tf,Correl_Period,0,MODE_SMA,PRICE_CLOSE,hedge_bn+i),2);
      }
   double dMathSqrt = MathSqrt(l1*s_1);
   if(dMathSqrt > 0) 
       return(u1 / dMathSqrt);
    return(0);   
  }
//+------------------------------------------------------------------+

может стоит и Ваш советник добавить, сократит число ложных открытий позиции.;) *hi* 
avatar

ssg

  • 15 апреля 2022, 18:15
0
Наверное имелось в виду ТП/СЛ или наоборот СЛ/ТП.
avatar

ssg

  • 15 апреля 2022, 18:07
+1
Вот написал для Вас. Можете также встроить в любой советник.
Код простой и понятен интуитивно.

//+------------------------------------------------------------------+
//|       Закрытие части позиции по условию взятии части профита.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                          http://www.mункцql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mункцql5.com"
#property version   "1.00"
#property strict

#define OP_FLAT          -1
#define TRADE_RETRY_COUNT 4 // номер определяет, сколько раз EA пытается отправить заказ.
#define TRADE_RETRY_WAIT  100 //Интервал сна в миллисекундах. 100 миллисекунд равны 0,1 секунды.

input double        Lots             = 0.02;      // Лот
input int           Slip             = 10;        // Проскальзование
static input int    Magic            = 1111;      // Magic
static input string ClosePart        = "     - = Настройка частичного закрытия ордеров = -";
input int           PartTakeProfit   = 300;       // Тейк частичного закрытия в пунктах
input double        PartCloseLots    = 0.01;      // Сколько закрывать
double posType       = OP_FLAT;
int    posTicket     = 0;
double posLots       = 0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   CloseOrderPart();
  }
//+------------------------------------------------------------------+
//| Проверка на условие закрытия PartTakeProfit и само закрытие поз  |
//+------------------------------------------------------------------+
void CloseOrderPart(){
   int cnt = OrdersTotal();
   for(int i=0; i<cnt; i++)
     {
      if(!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;
      if(OrderSymbol() != Symbol()) continue;
      if(OrderMagicNumber()!=Magic)    continue;
      if(OrderType() == OP_BUY){
         if(Bid-OrderOpenPrice() > PartTakeProfit*Point)
           {
            ClosePosition();
           }
        }
      if(OrderType() == OP_SELL)
        {
         if(OrderOpenPrice()-Ask > PartTakeProfit*Point)
           {
            ClosePosition();
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Функция  частичного закрытия позиций размером PartCloseLots      |
//+------------------------------------------------------------------+
void ClosePosition(){
   for(int attempt=0; attempt<TRADE_RETRY_COUNT; attempt++){
      bool closed;
      int lastError=0;
      if(posLots==Lots)
        {
         double price=MarketInfo(Symbol(),posType==OP_BUY ? MODE_BID : MODE_ASK);
         closed=OrderClose(posTicket,PartCloseLots,price,Slip,clrYellow);
         lastError=GetLastError();
        }
      if(closed) // Позиция закрыта
         break; // Выходим из цикла
      if(lastError==4108) // Не верный номер тикета
         break; // Выходим из цикла
      Sleep(TRADE_RETRY_WAIT);
      Print("Close Position retry no: "+IntegerToString(attempt+2)); //
     }
  }
//+------------------------------------------------------------------+

avatar

ssg

  • 15 апреля 2022, 18:05