0
Спасибо, посмотрел.
У каждого свои методы торговли и свои стратегии. Наверное и Ваш метод имеет право на жизнь.
Но я предпочитаю «отталкиваться» от графика самой цены, а не от её производной первого порядка (скользящая средняя и т.д.), и уж тем более второго порядка как у Вас в том советнике (индикатор от индикатора). Хотя признаю, что без индикаторов не обойтись, в конце концов график цены — это тоже индикатор.
Пост не для спора, просто высказал своё мнение.
avatar

ssg

  • 17 мая 2022, 15:35
0
Понятно. На размер лота Вы повлиять не не можете. Размер лота зависит от значения индикатора АДХ, а значит в данном случае случаен.
avatar

ssg

  • 17 мая 2022, 13:40
0
Т.е. советник должен находить позицию с минимальным лотом по счету одного символа, и при:
мин.лот.*К>=X
закрываются все открытые позиции данного символа?
А можете пояснить столь хитрый подход к закрытию позиций?
Я просто хочу понять:
1.Вы открываете разные позиции исходя из разных причин и стратегий.
2.Получилось так, что самый маленький лот у самой убыточной позиции.
3.И может получиться так, что нужно будет долго ждать пока сработает Ваше условие. А тем временем можно было много раз закрыть все позиции в плюсе.
avatar

ssg

  • 17 мая 2022, 11:41
0
На Форексе есть понятие — размер лота.
Размер лота открытой позиции — это размер лота текущей торговой операции.
Размер лота отложенного ордера — это размер лота предпологаемой в будущем торговой операции.
Что Вы имеете в виду:
Х = минимальный обьём сделки


и как следствие вопрос:
-по какому закону он должен «плавать»?
avatar

ssg

  • 17 мая 2022, 06:07
+1
Прошло две недели с момента публикации советника.Мне кажется для получения представления о работе советнике и его возможностей, для погонов в тестере и просмотра его работы на демосчете достаточно.
Тех кого советник заинтересовал и кто исследовал его прошу высказать своё мнение о его работе.
В будущем возможно сделаю полуавтомат с использованием управления при помощи кнопок на экране.
avatar

ssg

  • 16 мая 2022, 08:06
0
verta81, добрый вечер. Коли Вы написали этот советник, может добавите отключаемую функцию трала оставшегося стопового ордера вместо его удаления.
Для полноты исследования возможностей данной стратегии. Думаю форумчанам понравиться.
Например:
<code>
extern bool DelStop    = true;      //удалять стоповые ордера
</code>

<code>
if(DelStop){          // если разрешено удаление стоповых ордеров
 if(CountOrders()<2)  // и если отложенных ордеров меньше двух,  
    DelOrder();       // тогда оставшийся удаляем.
    }
 else{                // иначе
      TrailingOrder(); // тралим оставшийся стоповый ордер за ценой
    }
</code>

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

ssg

  • 12 мая 2022, 18:58
0
При ручной торговле иногда использую такой вариант:
1.при срабатывании одного из ордеров — второй удаляется.
2.выставляется опять отложенный ордер того же направления что и удаленный, но уже по другой цене и другим увеличенным лотом. С целью, что в случае отката будет не равнозначное локирование позиций.
3.Спустя некоторое время или при продолжении движения цены в сторону открывшейся ранее позиции опять удаляю отложенный ордер и снова выставляю его опять уже по более выгодной цене. Таких шагов может быть несколько. Происходит некоторое подобие трала стопового ордера за ценой.
4.В ночное или неурочное, для меня, время могу запустить советник с автотралением ордеров.
avatar

ssg

  • 12 мая 2022, 11:17
0

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountOrders()<2)//если отложенных ордеров меньше двух,  
    DelOrder();       // тогда оставшийся удаляем.
   
   if(CountOrders(6)<1 )//если нет ни открытых позиций ни отложенных ордеров
     {
      PutOrder(4,Ask+Distance*_Point);//тогда выставляем байстоп
      PutOrder(5,Bid-Distance*_Point);// и селлстоп ордераю
     }
   
  }
//+------------------------------------------------------------------+


У Вас на графике есть открытые позиции, поэтому отложенные ордера не выставляются.
Как только позиция закрылась — выставились два стоповых ордера.
В коде добавил комментарии для понимания что прописано в главной функции.
avatar

ssg

  • 12 мая 2022, 10:22
0

   if(countBuy_2+countSell_2>0) all_3=NormalizeDouble((allBuy_2 - allSell_2) / (countBuy_2 - countSell_2),_Digits);//Сибирь
avatar

ssg

  • 12 мая 2022, 07:08
+1
Настройки советника:


//-------------------------------------------------------------------
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 string s_6           = " Параметры безубытка";
extern bool   BU            = false;  // Использовать безубыток
extern int    LevelProfit   = 50;     // Уровень профита БУ

extern string s_7           = " Параметры трала";
extern bool   Trail         = True;    //  Использовать трал . Тралить всё
extern bool   BuyTrail      = True;    // Тралить покупки
extern int    TStop_Buy     = 50;      // Размер трала в пунктах для покупок
extern bool   SellTrail     = True;    // Тралить продажи
extern int    TStop_Sell    = 50;      // Размер трала в пунктах для продаж
extern int    TrailingStep  = 30;      // Шаг трала в пунктах

extern string s_8        = " Параметры StopLoss";
extern bool   StopOne    = false;  // Использовать стоплосс для первой позиции
extern bool   StopLoss   = false;  // Использовать стоплосс
extern double Kratnost   = 2;      // Коэф. кратности delta для расчета StopLoss

extern string s_9           = " Параметры трала средств";
extern bool   Tral       = false;  // Использовать трал средств
extern int    EqvTralStep= 80;     // Шаг трала по Эквити счета в валюте депозита

extern string s_10       = "Внешние параметры советника"; 
extern double Lot        = 0.01;   // Стартовый лот 
extern int    delta      = 150;    // Расстояние до стоп ордера от крайней позиции
extern bool   easy       = true;   // Использовать легкий вариант рассчета последующих лотов
extern int    Slip       = 30;     // Проскальзывание
extern int    Magic      = 123;    // Магик

extern bool   ShowComment   = True;    // Показывать комментарий
avatar

ssg

  • 10 мая 2022, 19:26
+2
Несколько человек обратились в привате с просьбой немного доработать советник.
Внес некоторый доработки.
1.Добавлена возможность выставления стоплосса. Стоплосс выставляется по следующей формуле sl=delta*Kratnost*_Point;
2.Добавлена функция выставления безубыка. БУ выставляется немного меньше чем стоплосс и расчитывается по формуле by = = delta*Kratnost*0.9*_Point;
3.Добавлена функция трала позиций в пунктах, как и по направления так и общий трал.
Все функции отключаемые.
Кто помнит и знает что такое факториал тот может понять сколько возможных вариантом закрытия и получения прибыли.
Читайте внимательно описание в настройках и тестируйте сами. Все варианты объяснять и обсуждать нет ни желания ни возможности.Думайте и решайте сами.
Советник здесь.
cloud.mail.ru/public/sQCh/WFqNPMJvY
avatar

ssg

  • 10 мая 2022, 15:12
0
Вы имеете полное право выдумывать любые формулы. Причем именно «любые». Но в таком случае проверяйте сами свои теории.Заниматься проверкой за вас этих «любых» формул мне не интересно.
Фраза:
<code>
Я вам, кажется говорил, что не торгую. Поэтому так быстро проверить не могу эту зебру.
Жду связи с автором, индикатор которого вы (если я правильно понял) даже не посмотрели на You Tube.
Уточню — отпишусь, а пока… пребываю при своем мнении.
Ошибки признавать умею.
</code>

не греет. Сначала сделайте проверки сами, я вам советник для проверки написал поэтому потрудитесь хоть запустить его и убедиться в том что ваши формулы поная … Пока не увижу ваши скрины с работой советника где идет расчет уровней БУ, который я вам написал, в разговоре участия принимать не буду. Да и мои знания и мое мнение вам не нужны. А свои выдумки проверите сами даже без ком-ра, да хоть с карандашиком на бумаге.
avatar

ssg

  • 10 мая 2022, 10:52
0

 if(countBuy+countSell>0) all_2=NormalizeDouble((allBuy/countBuy + allSell/countSell) / (countBuy + countSell),_Digits);//Odessa

тут даже проверять нечего.Зачем два раза делите на лоты?
avatar

ssg

  • 10 мая 2022, 04:55
0
1.На сайт зашёл, код экзешный, что внутри и как считается не знаю.
Поэтому для меня интереса не представляет.
2.
А на счет расчета, величины будут разные, ибо формулы разнятся. Что дальше то?

но не на два порядока же. У вас в формулах расчета ошибка.Посмотрите код где ошибка я указал.
3.Добавил еще два варианта расчета (обозвал Сибирь) используя первоначальный раздельный расчет покупок и продаж.
Бросьте на график и разберитесь.

//+------------------------------------------------------------------+
//|                                                       Odessa.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

extern int TrailingStop = 1000;
extern int Magic         = 111;        // магик
input color col = clrLime;
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   ObjectsDeleteAll();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--------------AM2
   double all=0, all_1=0, all_2=0, all_3=0,count=0,sl=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)
              {
               all+=OrderOpenPrice()*OrderLots();
               count+=OrderLots();
              }
           }
        }
     }
   if(count>0) all=NormalizeDouble(all/count,_Digits);// AM2
//--------------------------------------------------------------

//-----------------------Odessa
   double allBuy=0,countBuy=0,allSell=0,countSell=0;
   
   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)
              {
               allBuy+=OrderOpenPrice();//здесь не хватает умножения на *OrderLots() в этом ошибка
               countBuy+=OrderLots();
              }
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            if(OrderType()==OP_SELL)
              {
               allSell+=OrderOpenPrice();//здесь не хватает умножения на *OrderLots() в этом ошибка
               countSell+=OrderLots();
              }

   if(countBuy+countSell>0) all_1=NormalizeDouble((allBuy - allSell) / (countBuy - countSell),_Digits);//Odessa
//-----------------------------------------------------------------------

//------------------------------Сибирь
   double allBuy_2=0,countBuy_2=0,allSell_2=0,countSell_2=0;
   
   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)
              {
               allBuy_2+=OrderOpenPrice()*OrderLots();
               countBuy_2+=OrderLots();
              }
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            if(OrderType()==OP_SELL)
              {
               allSell_2+=OrderOpenPrice()*OrderLots();
               countSell_2+=OrderLots();
              }
  if(countBuy_2+countSell_2>0) all_2=NormalizeDouble((allBuy_2 + allSell_2) / (countBuy_2 + countSell_2),_Digits);//Сибирь
   if(countBuy_2+countSell_2>0) all_3=NormalizeDouble((allBuy_2 - allSell_2) / (countBuy_2 - countSell_2),_Digits);//Сибирь
//------------------------------------------------------------------- 
   DrawLABEL("AM2",StringConcatenate(count," лотов. БУ AM2 =  ",DoubleToStr(all,_Digits)),135,70,col,ANCHOR_LEFT);
   DrawLABEL("Odessa",StringConcatenate(countBuy+countSell," лотов. БУ Odessa =   ",DoubleToStr(all_1,_Digits)),135,90,col,ANCHOR_LEFT);  
   DrawLABEL("Сибирь1",StringConcatenate(countBuy_2+countSell_2," лотов. БУ Сибирь сложение =   ",DoubleToStr(all_2,_Digits)),135,110,col,ANCHOR_LEFT); 
   DrawLABEL("Сибирь2",StringConcatenate(countBuy_2+countSell_2," лотов. БУ Сибирь вычитание =   ",DoubleToStr(all_3,_Digits)),135,130,col,ANCHOR_LEFT);
  }
//+------------------------------------------------------------------+
color Color(bool P,color a,color b)
{
   if (P) return(a);
   else return(b);
}
//------------------------------------------------------------------
void DrawLABEL(string name, string Name, int X, int Y, color clr,ENUM_ANCHOR_POINT align=ANCHOR_RIGHT)
{
   if (ObjectFind(name)==-1)
   {
      ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
      ObjectSet(name, OBJPROP_CORNER, 2);
      ObjectSet(name, OBJPROP_XDISTANCE, X);
      ObjectSet(name, OBJPROP_YDISTANCE, Y);
      ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
      ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
      ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
      ObjectSetInteger(0,name,OBJPROP_ANCHOR,align); 
   }
   ObjectSetText(name,Name,12,"Arial",clr);
}
//--------------------------------------------------------------------
avatar

ssg

  • 9 мая 2022, 22:10
0
А если сделать проверку:
<code>
//+------------------------------------------------------------------+
//|                                                       Odessa.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

extern int TrailingStop = 1000;
extern int Magic         = 111;        // магик
input color col = clrLime;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   ObjectsDeleteAll();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
 //  bool mod;
   double all=0, all_1=0,count=0,sl=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)
              {
               all+=OrderOpenPrice()*OrderLots();
               count+=OrderLots();
              }
           }
        }
     }
   if(count>0)
      all=NormalizeDouble(all/count,_Digits);

   double allBuy=0,countBuy=0,allSell=0,countSell=0;
   
   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)
              {
               allBuy+=OrderOpenPrice();
               countBuy+=OrderLots();
              }
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            if(OrderType()==OP_SELL)
              {
               allSell+=OrderOpenPrice();
               countSell+=OrderLots();
              }

   if(countBuy+countSell>0)
      all_1=NormalizeDouble((allBuy - allSell) / (countBuy - countSell),_Digits);
      
  /* 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(Bid-all_1>TrailingStop*_Point)
                 {
                  if(OrderStopLoss()<Bid-TrailingStop*_Point)
                    {
                     sl=NormalizeDouble(Bid-TrailingStop*_Point,_Digits);
                     if(OrderStopLoss()!=sl)
                        mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
                    }
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(all_1-Ask>TrailingStop*_Point)
                 {
                  if((OrderStopLoss()>(Ask+TrailingStop*_Point)) || (OrderStopLoss()==0))
                    {
                     sl=NormalizeDouble(Bid+TrailingStop*_Point,_Digits);
                     if(OrderStopLoss()!=sl)
                        mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
                    }
                 }
              }
           }
        }
     }*/
   DrawLABEL("AM2",StringConcatenate(count," лотов.   БУ AM2 =  ",DoubleToStr(all,5)),135,70,col,ANCHOR_LEFT);
   DrawLABEL("Odessa",StringConcatenate(countBuy+countSell," лотов.   БУ Odessa =   ",DoubleToStr(all_1,5)),135,90,col,ANCHOR_LEFT);
  }
//+------------------------------------------------------------------+
color Color(bool P,color a,color b)
{
   if (P) return(a);
   else return(b);
}
//------------------------------------------------------------------
void DrawLABEL(string name, string Name, int X, int Y, color clr,ENUM_ANCHOR_POINT align=ANCHOR_RIGHT)
{
   if (ObjectFind(name)==-1)
   {
      ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
      ObjectSet(name, OBJPROP_CORNER, 2);
      ObjectSet(name, OBJPROP_XDISTANCE, X);
      ObjectSet(name, OBJPROP_YDISTANCE, Y);
      ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
      ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
      ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
      ObjectSetInteger(0,name,OBJPROP_ANCHOR,align); 
   }
   ObjectSetText(name,Name,12,"Arial",clr);
}
//--------------------------------------------------------------------
</code>


Откройте дополнительное окно той же пары где стоит любой ваш советник и есть открытые позиции. Задайте тот же магиг что и у работающего советника.Установите этот советник и посмотрите что насчитал вариант Андрея для БУ и что ваш.
«Павлины, говоришь? Эх...» Сухов Верещагину.«Белое солнце пустыни»
avatar

ssg

  • 9 мая 2022, 18:32
0
Без кода советника никто не сможет помочь.
avatar

ssg

  • 9 мая 2022, 16:24
0
Вы это к кому обращаетесь?
avatar

ssg

  • 9 мая 2022, 16:06
0
//ModifyOrders();

поставить две наклонные палочки (два слеша) перед ModifyOrders();
avatar

ssg

  • 9 мая 2022, 15:38