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

Рейтинг 2146



РЕКОМЕНДУЮ



Хитрый усреднитель доработка

Здравствуйте. На данном сайте, в группе «Программирование на MQL», на странице mql.opentraders.ru/34888.html имеется «Хитрый усреднитель на MQL5», убедительная просьба доработать этот усреднитель и сделать, чтобы он подхватывал и усреднял сделки по магику другого советника или открытые вручную по выбору (указать номер магика советника или 0 открытые вручную). Ищу поручителя для этого заказа.
  • 0
  • Просмотров: 2607
  • 4 июня 2022, 17:07
  • Ali-k
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

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

+
0
avatar

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

  • 6 июня 2022, 21:34
+
+1
Ищу поручителя для этого заказа.


вы наш 3333-й посетитель :D 
avatar

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

  • 6 июня 2022, 21:35
+
0
*shampan* *shampan* *shampan* 
avatar

  24  ShamanHand Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 6 июня 2022, 22:57
+
0
Пока работу по магику и открытие руками еще не протестил, но сразу вопрос возник, а нельзя сделать так, чтобы советник сам не торговал (сам не открывал сделок), а только подхватывал и усреднял сделки открытые по магику или вручную?
Редактирован: 7 июня 2022, 15:09
avatar

  5  Ali-k Автор Сообщений: 19

  • 7 июня 2022, 14:09
+
0
Пока работу по магику и открытие руками еще не протестил, но сразу вопрос возник, а нельзя сделать так, чтобы советник сам не торговал (сам не открывал сделок), а только подхватывал и усреднял сделки открытые по магику или вручную?



input int BuySell = 2; // 1-Only Buy 2-Only Sell


байселл ставьте 0, тогда будет только подхватывать
avatar

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

  • 7 июня 2022, 18:13
+
0
Поясните в коде, что при

input int BuySell = 0;

тогда будет только подхватывать

avatar

  16  ssg Сообщений: 817

  • 7 июня 2022, 18:58
+
0
Наверное вот если записать:

  if(BuySell==0)
             {
               if(CountTrades()>0 && FindLastBuyPrice()-Ask>=Step*_Point) trade.Buy(lot,NULL,Ask,0,0,"");
               if(CountTrades()>0 && Bid-FindLastSellPrice()>=Step*_Point) trade.Sell(lot,NULL,Bid,0,0,"");
             }

тогда будет только подхватывать
avatar

  16  ssg Сообщений: 817

  • 7 июня 2022, 19:22
+
0
Попробуйте так:


#property copyright "Copyright 2016, AM2" 
#property link "https://www.forexsystems.biz" 
#property version "1.00" 

#include <Trade\Trade.mqh> 
#include <Trade\PositionInfo.mqh>   

CTrade trade;
CPositionInfo pos;

input int BuySell     = 2;    // 1-Only Buy 2-Only Sell
input int Step        = 1000; // Step

input double Lot      = 0.1;  // Volume
input double BigLot   = 0.5;  // Big Lot
input double MaxLots  = 5;    // Maximum lot

input double Profit   = 60;   // Dollars Profit 
input double Loss     = 5100; // Dollars Loss
input double Mnogitel = 10;   // Lots Mnogitel 

int bars=0;
double lot=Lot,pr=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|  Position Profit                                                 |
//+------------------------------------------------------------------+
double SymbProfit(string Symb){
   double p=0;
   for(int i=PositionsTotal()-1;i>=0;i--){
      if(pos.Select(Symb))
        {
         p+=pos.Profit();
        }
     }
   return(p);
  }
//+------------------------------------------------------------------+
//|  Position Volume                                                 |
//+------------------------------------------------------------------+
double Lots(string Symb){
   double lots=0;
   for(int i=PositionsTotal()-1;i>=0;i--){
      if(pos.Select(Symb))
        {
         lots+=pos.Volume();
        }
     }
   return(lots);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(string symb){
   for(int i=PositionsTotal()-1;i>=0;i--){
      if(pos.Select(symb))
        {
         trade.PositionClose(symb);
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   string symb=Symbol();
   double Ask=SymbolInfoDouble(symb,SYMBOL_ASK);
   double Bid=SymbolInfoDouble(symb,SYMBOL_BID);

   if(bars!=Bars(symb,0))
     {
      if(BuySell==1 && (/*PositionsTotal()<1 ||*/ (PositionsTotal()>0 && (pr-Ask)/_Point>=Step))) {trade.PositionOpen(symb,0,lot,Ask,0,0); pr=Bid;}//buy
      if(BuySell==2 && (/*PositionsTotal()<1 ||*/ (PositionsTotal()>0 && (Bid-pr)/_Point>=Step))) {trade.PositionOpen(symb,1,lot,Bid,0,0); pr=Bid;}//sell

      if(Lots(symb)>=BigLot) lot=lot*Mnogitel;
      if(lot>MaxLots) lot=Lot;

      if(SymbProfit(symb)>Profit || SymbProfit(symb)<-Loss) {CloseAll(symb); lot=Lot;}
      bars=Bars(symb,0);
     }

   Comment("\n Lots: ",Lots(symb),
           "\n Profit: ",SymbProfit(symb),
           "\n Price: ",pr);
  }
//+------------------------------------------------------------------+

avatar

  16  ssg Сообщений: 817

  • 7 июня 2022, 15:40
+
0
ssg, я в найстройках теперь магика не вижу, а он нужен, чтобы проверить.
Редактирован: 7 июня 2022, 16:20
avatar

  5  Ali-k Автор Сообщений: 19

  • 7 июня 2022, 16:13
+
0
Прошу прощения, открыл код стартового советника. Смотрите:


#property copyright "Copyright 2022, AM2"
#property link "https://www.forexsystems.biz"
#property version "1.01"

#include <Trade\Trade.mqh>

CTrade trade;

input int BuySell     = 2;    // 1-Only Buy 2-Only Sell
input int Step        = 100;  // Step
input int Slip        = 100;  // Requote

input double Lot      = 0.1;  // Volume
input double BigLot   = 1;    // Big Lot
input double MaxLots  = 5;    // Maximum lot

input double Profit   = 160;  // Dollars Profit
input double Loss     = 5000; // Dollars Loss
input double Mnogitel = 11;   // Lots Mnogitel

input ulong Magic     = 123;  // Magic number

int bars=0;
double lot=Lot;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   trade.SetExpertMagicNumber(Magic);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|  Positions Profit                                                |
//+------------------------------------------------------------------+
double AllProfit()
  {
   double p=0;

   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
         if(PositionGetString(POSITION_SYMBOL)==_Symbol && PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            p+=PositionGetDouble(POSITION_PROFIT);
           }
        }
     }
   return(p);
  }
//+------------------------------------------------------------------+
//|  Position Volume                                                 |
//+------------------------------------------------------------------+
double Lots()
  {
   double lots=0;

   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
         if(PositionGetString(POSITION_SYMBOL)==_Symbol && PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            lots+=PositionGetDouble(POSITION_VOLUME);
           }
        }
     }
   return(lots);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll()
  {
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
         if(PositionGetString(POSITION_SYMBOL)==_Symbol && PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            trade.PositionClose(PositionGetTicket(i),Slip);
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;

   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
         if(PositionGetString(POSITION_SYMBOL)==_Symbol && PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            if(PositionGetInteger(POSITION_TYPE)<2)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double FindLastBuyPrice()
  {
   double p=0;
   
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)) && PositionGetInteger(POSITION_TYPE)==0)
        {
         if(PositionGetString(POSITION_SYMBOL)==_Symbol && PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            p=PositionGetDouble(POSITION_PRICE_OPEN);
            break;
           }
        }
     }
   return(p);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double FindLastSellPrice()
  {
   double p=0;
   
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)) && PositionGetInteger(POSITION_TYPE)==1)
        {
         if(PositionGetString(POSITION_SYMBOL)==_Symbol && PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            p=PositionGetDouble(POSITION_PRICE_OPEN);
            break;
           }
        }
     }
   return(p);
  }
//+------------------------------------------------------------------+
//|  Position Profit                                                 |
//+------------------------------------------------------------------+
int PositionType()
  {
   int type=8;

   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
         if(PositionGetString(POSITION_SYMBOL)==_Symbol && PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            type=(int)PositionGetInteger(POSITION_TYPE);
            break;
           }
        }
     }
   return(type);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double Ask=SymbolInfoDouble(NULL,SYMBOL_ASK);
   double Bid=SymbolInfoDouble(NULL,SYMBOL_BID);

   if(bars!=Bars(NULL,0))
     {
      if(BuySell==1 && (/*CountTrades()<1 ||*/ (CountTrades()>0 && FindLastBuyPrice()-Ask>=Step*_Point)))
        {
         trade.Buy(lot,NULL,Ask,0,0,"");   //buy
        }
      if(BuySell==2 && (/*CountTrades()<1 ||*/ (CountTrades()>0 && Bid-FindLastSellPrice()>=Step*_Point)))
        {
         trade.Sell(lot,NULL,Bid,0,0,"");   //sell
        }

      if(Lots()>=BigLot) lot=lot*Mnogitel;
      if(lot>MaxLots) lot=Lot;

      if(AllProfit()>Profit || AllProfit()<-Loss) {CloseAll(); lot=Lot;}
      bars=Bars(NULL,0);
     }

   Comment("\n Lots: ",Lots(),
           "\n Profit: ",AllProfit());
  }
//+------------------------------------------------------------------+

avatar

  16  ssg Сообщений: 817

  • 7 июня 2022, 16:38
+
0
Может просто 0 поставить где input int BuySell? И тогда сам советник работать не будет?
ssg, благодарю попробую отпишусь.
Редактирован: 7 июня 2022, 16:46
avatar

  5  Ali-k Автор Сообщений: 19

  • 7 июня 2022, 16:32
+
0
Вы не разобрались в коде советника.
В главной функции советника нет переменной BuySell равной 0.
Сама переменная

input int BuySell     = 2;    // 1-Only Buy 2-Only Sell

отвечает за направление торговли:
1-Only Buy = только покупки.
2-Only Sell = только продажи.
Попробуйте проанализировать код по приведенному примеру:


//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double Ask=SymbolInfoDouble(NULL,SYMBOL_ASK);
   double Bid=SymbolInfoDouble(NULL,SYMBOL_BID);

   if(bars!=Bars(NULL,0))
     { //если разрешены покупки и (нет открытых позиций или есть позиции и разница между растояние старой цены позиции - текущая цена больше или равно шагу)
      if(BuySell==1 && (CountTrades()<1 || (CountTrades()>0 && FindLastBuyPrice()-Ask>=Step*_Point)))
        {//открываем позицию на покупку.
         trade.Buy(lot,NULL,Ask,0,0,"");   //buy
        }
      if(BuySell==2 && (CountTrades()<1 || (CountTrades()>0 && Bid-FindLastSellPrice()>=Step*_Point)))
        {
         trade.Sell(lot,NULL,Bid,0,0,"");   //sell
        }

      if(Lots()>=BigLot) lot=lot*Mnogitel;
      if(lot>MaxLots) lot=Lot;

      if(AllProfit()>Profit || AllProfit()<-Loss) {CloseAll(); lot=Lot;}
      bars=Bars(NULL,0);
     }

   Comment("\n Lots: ",Lots(),
           "\n Profit: ",AllProfit());
  }
//+------------------------------------------------------------------+

avatar

  16  ssg Сообщений: 817

  • 7 июня 2022, 16:53
+
0
Если переменная BuySell будет равной 0 советник вообще ничего не будет делать.
Можно ввести и использование BuySell = 0 тогда нужно изменить логику.
avatar

  16  ssg Сообщений: 817

  • 7 июня 2022, 16:58
+
0
К сожалению, я почти не разбираюсь в коде, я с точки зрения на мой вопрос: «нельзя сделать так, чтобы советник сам не торговал (сам не открывал сделок), а только подхватывал и усреднял сделки открытые по магику или вручную», то что он совсем не будет ничего делать в случае 0 я не подумал.
Буду пробовать ваш вариант.
Редактирован: 7 июня 2022, 17:07
avatar

  5  Ali-k Автор Сообщений: 19

  • 7 июня 2022, 17:06
+
0
Тут еще вопрос возник, а если советник по магику которого будет работать этот усреднитель может торговать в обе стороны, то как себя усреднитель поведет?
avatar

  5  Ali-k Автор Сообщений: 19

  • 7 июня 2022, 17:15
+
0
Переведите.
avatar

  16  ssg Сообщений: 817

  • 7 июня 2022, 17:23
+
0
Как я понимаю, данный усреднитель по моей просьбе теперь работает по магику другого советника (подхватывет открытую им сделку и ее ведет) или нет?
avatar

  5  Ali-k Автор Сообщений: 19

  • 7 июня 2022, 17:41
+
0
Просто теперь у вас будет два советника, торгующих каждый по своей стратегии, но оба имеют одинаковые магики.
Первый торгует по своей стратегии, а второй усредняет существующие позиции.
Закрытие или по первой стратегии или по условию:

if(AllProfit()>Profit || AllProfit()<-Loss) {CloseAll(); lot=Lot;}

второго советника.
avatar

  16  ssg Сообщений: 817

  • 7 июня 2022, 18:52
+
0
Тут еще вопрос возник, а если советник по магику которого будет работать этот усреднитель может торговать в обе стороны, то как себя усреднитель поведет?


такие вещи нужно сразу прописывать в тз
avatar

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

  • 7 июня 2022, 18:11
+
0
Вот эти слова только сейчас прочитал: «байселл ставьте 0, тогда будет только подхватывать», случайно сам догадался по логике, но спасибо за подсказку.

такие вещи нужно сразу прописывать в тз

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

  5  Ali-k Автор Сообщений: 19

  • 7 июня 2022, 18:46
+
0
AM2, что-то пробую байселл 0 не подхватывает, не советника, не в ручную открытые.

ssg, подскажите пожалуста где конкретно в коде записать те пару строчек выше указанные, чтобы только подхватывал?
avatar

  5  Ali-k Автор Сообщений: 19

  • 20 июня 2022, 15:02
+
0

input ulong Magic     = 123;  // Magic number

должен быть одинаковый у открытой позиции и у советника, или = 0 если позиция открыта «руками».
avatar

  16  ssg Сообщений: 817

  • 20 июня 2022, 15:40
+
0
Это понимаю.
Вопрос относительно:

if(BuySell==0)
{
if(CountTrades()>0 && FindLastBuyPrice()-Ask>=Step*_Point) trade.Buy(lot,NULL,Ask,0,0,"");
if(CountTrades()>0 && Bid-FindLastSellPrice()>=Step*_Point) trade.Sell(lot,NULL,Bid,0,0,"");
}

где это вставить в код, чтобы сам усреднитель не торговал, а только подхватывал?
avatar

  5  Ali-k Автор Сообщений: 19

  • 20 июня 2022, 16:12
+
0
Или, если не затруднит, может покажете здесь как будет выглядеть код со вставленным в него данным куском кода, для правильной работы.
avatar

  5  Ali-k Автор Сообщений: 19

  • 20 июня 2022, 16:55
+
0

input int BuySell     = 2;    // 1-Only Buy 2-Only Sell 0-No Buy No Sell



//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double Ask=SymbolInfoDouble(NULL,SYMBOL_ASK);
   double Bid=SymbolInfoDouble(NULL,SYMBOL_BID);

 if(BuySell==0)
             {
               if(CountTrades()>0 && FindLastBuyPrice()-Ask>=Step*_Point) trade.Buy(lot,NULL,Ask,0,0,"");
               if(CountTrades()>0 && Bid-FindLastSellPrice()>=Step*_Point) trade.Sell(lot,NULL,Bid,0,0,"");
             }

   if(bars!=Bars(NULL,0))
     {
      if(BuySell==1 && (/*CountTrades()<1 ||*/ (CountTrades()>0 && FindLastBuyPrice()-Ask>=Step*_Point)))
        {
         trade.Buy(lot,NULL,Ask,0,0,"");   //buy
        }
      if(BuySell==2 && (/*CountTrades()<1 ||*/ (CountTrades()>0 && Bid-FindLastSellPrice()>=Step*_Point)))
        {
         trade.Sell(lot,NULL,Bid,0,0,"");   //sell
        }

      if(Lots()>=BigLot) lot=lot*Mnogitel;
      if(lot>MaxLots) lot=Lot;

      if(AllProfit()>Profit || AllProfit()<-Loss) {CloseAll(); lot=Lot;}
      bars=Bars(NULL,0);
     }

   Comment("\n Lots: ",Lots(),
           "\n Profit: ",AllProfit());
  }
//+------------------------------------------------------------------+



avatar

  16  ssg Сообщений: 817

  • 20 июня 2022, 17:59
+
0
ssg, благодарю, вроде работает.

AM2, благодарю за хитрый усреднитель!
Редактирован: 21 июня 2022, 23:21
avatar

  5  Ali-k Автор Сообщений: 19

  • 21 июня 2022, 23:20
+
0
ssg, тестирую усреднитель, но странная вещь, на некоторых парах, не на всех, при одинаковых настройках обоих советников в момент открытия позиции, не усреднителем, а другим советником, усреднитель сразу открывает противоположную позицию тем же объемом, что это может быть за ошибка?
avatar

  5  Ali-k Автор Сообщений: 19

  • 22 июня 2022, 20:24
+
0
Для решения такой проблемы нужно разбираться с каждым случаем отдельно.
Сейчас это выглядит примерно так:
Доктор у меня иногда что-то болит.Что это может быть и почему?
Подумайте сами, если ошибка возникает иногда и при определенных условиях, значит проблема не в коде, а в тех условиях когда она возникла.
Может быть открыто несколько разнонаправленных позиций и усредняется какая-то другая позиция. Не знаю.
Скажу честно сразу заниматься поиском причины сбоев не желания и не буду.
Пользуйтесь теми парами где нет ошибок, или пересмотрите условия открытия позиций на тех парах где возникают указанные ошибки.
avatar

  16  ssg Сообщений: 817

  • 22 июня 2022, 21:00
+
0
Хорошо. И на том спасибо.
avatar

  5  Ali-k Автор Сообщений: 19

  • 22 июня 2022, 22:23

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