Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 944

 
eflaer:

Здравствуйте, подскажите пожалуйста если советник установить к примеру на 10 валютных пар,

можно ли ему програмно задать максимальное кол-во пар на которых можно открыться? 

То есть если советник стоит на 10 чартах разных пар а в настройках указано что максимальное кол-во пар - 5. 

И советник работает только на 5 первых парах а остальные 5 пар игнорируются? 

Вообще такое возможно?

Если код в .mq формате, то можно. Не путать с .ex

 

Добрый день всем
Возник такой вопрос.Прошу Вас немного помочь в прояснении ситуации.

Робот сеточник при запуске расставляет сетку лимитных ордеров ORDER_TYPE_BUY_LIMIT(также и ORDER_TYPE_BUY_STOP наверх). Шаг сетки 1, тейки 0,5, объём по 1 лоту. Проблема в том, что я начинаю набирать позицию лонгую раз(купил по 10, тейк стал в 10,5), не тейкаюсь; лонгую второй раз(купил по 9, тейк в 9,5), объём уже 2 лота. Потом цена начинает заходить и весь объем тейкается в 9,5!!!

Ордера выставляются структурой

      MqlTradeRequest request_={0};
      request_.action=TRADE_ACTION_PENDING;         // установка отложенного ордера 
      request_.magic=order_magic;                  // ORDER_MAGIC 
      request_.symbol=pair;                      // инструмент 
      request_.volume=v_b;                          // объем в 0.1 лот 
      request_.tp=pr_ent_tp;                                // Take Profit 
      //--- сформируем тип ордера 
      request_.type=ORDER_TYPE_BUY_LIMIT;                // тип ордера 
      //---сформируем цену для отложенного ордера 
      request_.price=pr_ent;  // цена для открытия 
      //--- отправим торговый приказ 
      MqlTradeResult result_={0};
      m_Trade.OrderSend(request_,result_);

А мне нужно чтобы каждый тейкался в своём тейке. Заход в 10,ждал цену 10,5
Заход в 9,цену 9,5.А не весь объем в первом же тейке.

Надо подшаманить со структурой что-нибудь?

 
ISL:

Добрый день всем
Возник такой вопрос.Прошу Вас немного помочь в прояснении ситуации.

Робот сеточник при запуске расставляет сетку лимитных ордеров ORDER_TYPE_BUY_LIMIT(также и ORDER_TYPE_BUY_STOP наверх). Шаг сетки 1, тейки 0,5, объём по 1 лоту. Проблема в том, что я начинаю набирать позицию лонгую раз(купил по 10, тейк стал в 10,5), не тейкаюсь; лонгую второй раз(купил по 9, тейк в 9,5), объём уже 2 лота. Потом цена начинает заходить и весь объем тейкается в 9,5!!!

Ордера выставляются структурой

А мне нужно чтобы каждый тейкался в своём тейке. Заход в 10,ждал цену 10,5
Заход в 9,цену 9,5.А не весь объем в первом же тейке.

Надо подшаманить со структурой что-нибудь?

используйте счёт типа "Hedge", а не "Netting"

 
Чтобы его изменить, надо заново МТ и поставить галочку, Использовать хедж. Или я могу существующий поменять?
 
ISL:
Чтобы его изменить, надо заново МТ и поставить галочку, Использовать хедж. Или я могу существующий поменять?

Заново и поставить галочку ...

 
Спасибо!
 
Снова с тем же вопросом, кто-нибудь реализовывал такую систему тейков для Netting счета? Может есть где на форуме, кто этим задавался?
 
ISL:
Снова с тем же вопросом, кто-нибудь реализовывал такую систему тейков для Netting счета? Может есть где на форуме, кто этим задавался?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: Virtual

fxsaber, 2018.11.15 17:16

На Netting позиция всегда имеет только один TP. Поэтому, в частности, сеточные ТС, у которых каждой ордер в сетке имеет свой TP не будет работать, как задумывалось.

Ниже пример, как это обходится

// Пример Netting с поддержкой множества однонаправленных позиций (у каждой могут быть свои Magic, SL/TP, Comment, OpenTime и т.д.).
// Запустите этот пример на Netting-счете в Тестере с влюченной Визуализацией.

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define VIRTUAL_LIMITS_TP_SLIPPAGE // Лимитники и TP исполняются по первой цене акцепта - положительные проскальзывания
#include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/ru/code/22577
#include <fxsaber\Virtual\Sync.mqh>    // Синхронизатор

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

input int iAmount = 5;   // Количество ордеров в сетке
input int iOffset = 120; // На каком расстоянии (в пипсах) ставить ордера сетки
input int iTP = 120;     // TakeProfit каждого ордера сетки

// Выставляем один раз сетку из Amount ордеров на Offset-расстоянии друг от друга с заданным TP.
void System( const int Amount, const int Offset, const int TP )
{
  static bool FirstRun = true;
  
  if (FirstRun)  
  {
    for (int i = 1; i <= Amount; i++)
    {
      const double PriceOpen = Ask - i * Offset * _Point;
      const double PriceTP = PriceOpen + TP * _Point;
      
      OrderSend(_Symbol, OP_BUYLIMIT, 1, PriceOpen, 0, 0, PriceTP, (string)i); // Выставляем каждый ордер сетки
    }
    
    FirstRun = false;
  }
}

void OnTick()
{  
  static const bool Init = VIRTUAL::Select(VIRTUAL::Create()); // Система будет работать в этом виртуальном окружении
  static const bool IsVisual = MQLInfoInteger(MQL_VISUAL_MODE);
  static bool FirstRun = true;

  VIRTUAL::NewTick();            // Добавили тик в виртуальное торговое окружение
  System(iAmount, iOffset, iTP); // Запустили ТС на выбранном торговом окружении (виртуальное)
  
  SYNC::Positions<ISTIME>(); // Синхронизировли реальное торговое окружение с виртуальным

  if (IsVisual)
    Comment(VIRTUAL::ToString(true)); // Вывели на чарт состояние виртуального торгового окружения (true - вместе с историей торгов)
}


Идея простейшая. Запустили ТС в виртуальном, а в реальном просто синхронизируем. Исходник ТС менять не нужно (функция System в примере).

 

Добрый день. Я хотел сделать mqh файл, где будет лежать подсчитанные массивы, пока не закрыл терминал и перекачать их только тогда, когда будет большой разрыв по времени (в моем случае 3600). Но получается так, если я компилирую индикатор, то mqh файл тоже сбрасывает все массивы. Как можно сделать так что-бы я мог все делать с индикатором и компилировать, но mqh файл не сбрасывался, пока терминал не закрыт?

class CMyTicks
  {
protected:
   int               countTicks;

public:
   datetime          m_TickTime[];
   datetime          m_FirstTickTime;
   //+------------------------------------------------------------------+
   //| Constructor.                                                     |
   //+------------------------------------------------------------------+      
   void CMyTicks()
     {
      countTicks=0;
     }
   //+------------------------------------------------------------------+  
   void CollectTicks(int m_getticks=1000)
     {
      MqlTick           items[];
      int received=CopyTicks(_Symbol,items,COPY_TICKS_ALL,0,m_getticks);
      
      ...
      m_FirstTickTime=items[0].time;
     }
  };
//+------------------------------------------------------------------+
#include <Test_Array_Include.mqh>
CMyTicks  Test;
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   ReloadAsk();
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
int      getticks=100000;
datetime firstticktime=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ReloadAsk()
  {
   MqlTick           items[];
   int received=CopyTicks(_Symbol,items,COPY_TICKS_ALL,0,getticks);
   firstticktime=items[0].time;

   if((int)firstticktime>(int)Test.m_FirstTickTime+3600)
     {
      Test.CollectTicks(getticks);
      int ArrSize=ArraySize(Test.m_TickTime);
      Print(" Should not apear after compilation. ArrSize: ",ArrSize); // 
     }
  }
//+------------------------------------------------------------------+
 
прошу заблокировать учетку на месяц.