0
Добрый вечер, Андрей.
Даже и не знаю что писать и какие сканы.
Открытие первых позиций как и было в прошлом заказе.
Перемещение линий как и было в прошлом заказе
Только вместо тейпрофита и стоплосса советник на этих линиях должен выставить отложенные ордера байстоп и селлстоп.
Закрытие всех позиций и удаление всех отложенных ордеров по общему профиту.
Всё.
avatar

ssg

  • 28 августа 2022, 16:33
0
Это была ирония.
-бесплатный советник
-как купить на сайте…
avatar

ssg

  • 31 июля 2022, 11:50
0
Что не получается сравнить размеры лотов?
avatar

ssg

  • 21 июля 2022, 21:27
0
И так до бесконечности увеличиваем период медленной МАшки, пока не исчезнет сигнал на том баре, на котором есть сигнал от пересечения мувингов с первоначальными настройками.После чего выводим период медленной МАшки

В таком случае боюсь это будет «средняя температура по больнице».Наличие и кол-во сигналов будет зависит от скорости и прихода тиков за текущий бар.
Может тогда проще подсчитывать кол-во тиков и потом прибавить к периоду медленной Ма.
avatar

ssg

  • 20 июля 2022, 10:06
0
Вырезал функцию автоматического расчета лотов из одного из своих старых мультивалютников и сделал в виде советника.

//+------------------------------------------------------------------+
//|                                        Lot symb1 & Lot symb2.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

input string  SYMBOL1        = "EURUSD"; //второй символ
input string  SYMBOL2        = "GBPUSD"; //первый символ


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
    double ynax=MarketInfo(SYMBOL1, MODE_TICKVALUE)/MarketInfo(SYMBOL2, MODE_TICKVALUE)*
   (iOpen(SYMBOL1,0,0)/MarketInfo(SYMBOL1, MODE_TICKSIZE))/(iOpen(SYMBOL2,0,0)/MarketInfo(SYMBOL2, MODE_TICKSIZE));

   double minx=0, miny=0, mindelta=9999;

   for (double x=0.01; x<=1; x+=0.01)
    {
   for (double y=0.01; y<=1; y+=0.01)
     {
      double delta=MathAbs(y/x-ynax);
      if (delta<mindelta)
        {
         minx=NormalizeDouble(x,2);
         miny=NormalizeDouble(y,2);
         mindelta=NormalizeDouble(delta,2);
        }
      }
    }

string LotsS1  = DoubleToStr(minx,2);   
string LotsS2  = DoubleToStr(miny,2); 

Comment(TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS),
        " \n Символ №1 - "+SYMBOL1+"  "+DoubleToString(LotsS1,2),
        " \n Символ №2 - "+SYMBOL2+"  "+DoubleToString(LotsS2,2)
        );
         
  }
//+------------------------------------------------------------------+



Запустите у себя. Интересно посмотреть и сравнить что покажет ваш индикатор и мой советник. Насколько большая будет разница. Ну и в идеале сравнить работу советника в тестере с лотами рассчитанными вашим индикатором и моим советником.
Если не затруднит выложите результаты таких сравнений здесь.
avatar

ssg

  • 20 июля 2022, 10:00
0
Ну на нет, и суда нет. Хотел посмотреть методику расчета лотов пар.Тогда можно было бы сразу прописать в советнике.
avatar

ssg

  • 20 июля 2022, 09:19
0
Да, такой код читать — только глаза ломать.Это не претензия, а констатация факта. Главное что-бы он вам приносил прибыль.
avatar

ssg

  • 19 июля 2022, 21:07
0
Ну если
А код если прогнать тестере покажет точные места входа и выхода из сделок.

остальное второстепенно.
Только откуда такая уверенность?
avatar

ssg

  • 19 июля 2022, 19:40
0
Можно посмотреть код
А лот подбираю также на дневках, с помощью индикатора i-Diff2Pairs.
avatar

ssg

  • 19 июля 2022, 15:42
0
Как то быстро сломались и закончили тестирование.
Можно попробовать закрывать позиции по времени:
— если прибыль менее некоторого значения меньше чем input int Profit = 50;
(предполагается что прибыль уже расти не будет в перспективе).
— или если уже имеется убыток меньше чем input int Loss = 0;
(предполагается что в дальше убыток будет только возрастать).
Можно для этих обоих случаях можно использовать разное время жизни позиций
input uchar AfterHour = 5;
Не уверен, что будет явное преимущество, но а вдруг. Причем эти условия надо тестировать при параметрах используемых в Сообщений: 13.
Т.е. у вас есть хороший результат при этих параметрах, а что будет если ввести дополнительные условия?
avatar

ssg

  • 19 июля 2022, 13:16
0
Вот вариант с функцией закрытия от Андрея.


//+------------------------------------------------------------------+
//|                                                       Corel2.mq5 |
//|                                              Copyright 2022, AM2 |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, AM2"
#property link      "https://www.forexsystems.biz"
#property version   "1.00"

#include <Trade\Trade.mqh>             // Подключаем торговый класс CTrade
CTrade trade;

//--- входные параметры
input double   Lot        = 1;         // Лот

input string   Symb       = "USDCHF";  // 2-й символ

input double   LotSymb    = 1;         // Лот

input int      Loss       = 0;         // Лось в валюте
input int      Profit     = 50;        // Профит в валюте

input double   Sigma      = 333;       // Расхождение пар
input bool     CloseCross = 1;         // Закрытие по пересечению

input bool     CloseHour  = 1;         // Закрытие по пересечению
input uchar    AfterHour  = 5;         // Закрыть позиции через AfterHour часов

input int      Slip       = 0;         // Проскальзывание
input ulong    Magic      = 123;       // Магик

input string IndName      = "Coral";
input int bar             = 55;

int ind=0;
double s1[2],s2[2];
datetime t=0;
long    afterhour  = 0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ind=iCustom(NULL,0,IndName,Symb,bar);
   trade.SetExpertMagicNumber(Magic);
   afterhour  = 0;
   afterhour=AfterHour*60*60;
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|  Position Profit                                                 |
//+------------------------------------------------------------------+
double AllProfit()
  {
   double p=0;

   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
         if(PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            p+=PositionGetDouble(POSITION_PROFIT);
           }
        }
     }
   return(p);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll()
  {
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
         if(PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            if(PositionGetInteger(POSITION_TYPE)<2)
              {
               trade.PositionClose(PositionGetTicket(i));
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;

   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
         if(PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            if(PositionGetInteger(POSITION_TYPE)<2)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAfterHour()
  {
//---
   for(int i=PositionsTotal()-1; i>=0; i--) 
      if(m_position.SelectByIndex(i))
        {
         if(TimeCurrent()-m_position.Time()>=afterhour) CloseAll();
        }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double Ask1=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double Bid1=SymbolInfoDouble(_Symbol,SYMBOL_BID);

   double Ask2=SymbolInfoDouble(Symb,SYMBOL_ASK);
   double Bid2=SymbolInfoDouble(Symb,SYMBOL_BID);

   double sigma=MathAbs(s1[0]-s2[0])/_Point;

   CopyBuffer(ind,0,0,2,s1);
   CopyBuffer(ind,1,0,2,s2);
        
   if(CloseHour)CloseAfterHour();

   if(t!=iTime(NULL,0,0))
     {
      if(CountTrades()<1 && sigma>Sigma)
        {
         if(s1[0]<s2[0])
           {
            trade.Buy(Lot,_Symbol,Ask1,0,0,"");
            trade.Sell(LotSymb,Symb,Bid2,0,0,"");
           }

         if(s1[0]>s2[0])
           {
            trade.Sell(Lot,_Symbol,Bid1,0,0,"");
            trade.Buy(LotSymb,Symb,Ask2,0,0,"");
           }
        }

      if((AllProfit()>Profit && Profit>0) || (AllProfit()<-Loss && Loss>0) || (s1[0]>s2[0] && s1[1]<s2[1]&& CloseCross) || (s1[0]<s2[0] && s1[1]>s2[1] && CloseCross))
         CloseAll();
     
      t=iTime(NULL,0,0);
     }

   Comment("\n Trades: ",CountTrades(),
           "\n Profit: ",AllProfit(),
           "\n Sigma: ",sigma,
           "\n Symbol1: ",s1[0],
           "\n Symbol2: ",s2[0]);
  }
//+------------------------------------------------------------------+
avatar

ssg

  • 19 июля 2022, 12:56
0
Проверьте наличие класса #include <Trade\PositionInfo.mqh> у вас в редакторе как у класса #include <Trade\Trade.mqh>
avatar

ssg

  • 19 июля 2022, 12:21
0
Назначение этого кода какое?
avatar

ssg

  • 19 июля 2022, 12:15
0
По возможности с таблицами и графиками. Думаю многих это заинтересует.В дальнейшем может появятся мысли и предложения по развитию данной темы в направлении эффективности использования стратегии.
avatar

ssg

  • 19 июля 2022, 11:49
0
Попробуйте такой вариант.
Единственная просьба выложить здесь итоги эффективности тестирования советника с данной функцией с вашими рекомендациями её использования при данном методе торговли (парная торговля).


//+------------------------------------------------------------------+
//|                                                       Corel2.mq5 |
//|                                              Copyright 2022, AM2 |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, AM2"
#property link      "https://www.forexsystems.biz"
#property version   "1.00"

#include <Trade\Trade.mqh>             // Подключаем торговый класс CTrade
#include <Trade\PositionInfo.mqh>
CTrade trade;
CPositionInfo  m_position;  

//--- входные параметры
input double   Lot        = 1;         // Лот

input string   Symb       = "USDCHF";  // 2-й символ

input double   LotSymb    = 1;         // Лот

input int      Loss       = 0;         // Лось в валюте
input int      Profit     = 50;        // Профит в валюте

input double   Sigma      = 333;       // Расхождение пар
input bool     CloseCross = 1;         // Закрытие по пересечению

input bool     CloseHour  = 1;         // Закрытие по пересечению
input uchar    AfterHour  = 5;         // Закрыть позиции через AfterHour часов

input int      Slip       = 0;         // Проскальзывание
input ulong    Magic      = 123;       // Магик

input string IndName      = "Coral";
input int bar             = 55;

int ind=0;
double s1[2],s2[2];
datetime t=0;
long    afterhour  = 0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ind=iCustom(NULL,0,IndName,Symb,bar);
   trade.SetExpertMagicNumber(Magic);
   afterhour  = 0;
   afterhour=AfterHour*60*60;
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|  Position Profit                                                 |
//+------------------------------------------------------------------+
double AllProfit()
  {
   double p=0;

   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
         if(PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            p+=PositionGetDouble(POSITION_PROFIT);
           }
        }
     }
   return(p);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll()
  {
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
         if(PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            if(PositionGetInteger(POSITION_TYPE)<2)
              {
               trade.PositionClose(PositionGetTicket(i));
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;

   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
         if(PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            if(PositionGetInteger(POSITION_TYPE)<2)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAfterHour()
  {
//---
   for(int i=PositionsTotal()-1; i>=0; i--) 
      if(m_position.SelectByIndex(i))
        {
         if(TimeCurrent()-m_position.Time()>=afterhour)
            m_trade.PositionClose(m_position.Ticket());
        }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double Ask1=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double Bid1=SymbolInfoDouble(_Symbol,SYMBOL_BID);

   double Ask2=SymbolInfoDouble(Symb,SYMBOL_ASK);
   double Bid2=SymbolInfoDouble(Symb,SYMBOL_BID);

   double sigma=MathAbs(s1[0]-s2[0])/_Point;

   CopyBuffer(ind,0,0,2,s1);
   CopyBuffer(ind,1,0,2,s2);
        
   if(CloseHour)CloseAfterHour();

   if(t!=iTime(NULL,0,0))
     {
      if(CountTrades()<1 && sigma>Sigma)
        {
         if(s1[0]<s2[0])
           {
            trade.Buy(Lot,_Symbol,Ask1,0,0,"");
            trade.Sell(LotSymb,Symb,Bid2,0,0,"");
           }

         if(s1[0]>s2[0])
           {
            trade.Sell(Lot,_Symbol,Bid1,0,0,"");
            trade.Buy(LotSymb,Symb,Ask2,0,0,"");
           }
        }

      if((AllProfit()>Profit && Profit>0) || (AllProfit()<-Loss && Loss>0) || (s1[0]>s2[0] && s1[1]<s2[1]&& CloseCross) || (s1[0]<s2[0] && s1[1]>s2[1] && CloseCross))
         CloseAll();
     
      t=iTime(NULL,0,0);
     }

   Comment("\n Trades: ",CountTrades(),
           "\n Profit: ",AllProfit(),
           "\n Sigma: ",sigma,
           "\n Symbol1: ",s1[0],
           "\n Symbol2: ",s2[0]);
  }
//+------------------------------------------------------------------+
avatar

ssg

  • 19 июля 2022, 11:41
0
А чем не устраивает закрытие по размеру убытка:
|| (AllProfit()<-Loss && Loss>0

avatar

ssg

  • 19 июля 2022, 10:37
0
А как определяете: зависли позиции или нет? Т.е. как определить, что пора закрывать позиции.
avatar

ssg

  • 19 июля 2022, 03:12
0
Дело ваше. Только то, что вы видите глазами, далеко не всегда истинно. Машина понимает только численные значения, а не визуальный ряд…
avatar

ssg

  • 15 июля 2022, 19:54
0
Такие условия надо дополнять некоторым доверительным интервалом (+-).Или очень грубый шаг.При жестких условиях сигналов можно и не дождаться.
avatar

ssg

  • 15 июля 2022, 19:16