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

 
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); // 
     }
  }
//+------------------------------------------------------------------+
 
прошу заблокировать учетку на месяц.
 

Подскажите как получить время последней модификации ордера ?

Как мне кажется эту информацию должна давать функция  OrderGetInteger с параметром ENUM_ORDER_PROPERTY_INTEGER  https://www.mql5.com/ru/docs/constants/tradingconstants/orderproperties#enum_order_property_integer

Но , что то нет там такого. Может другие способы есть ?

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
 
pivomoe:

Подскажите как получить время последней модификации ордера ?

Как мне кажется эту информацию должна давать функция  OrderGetInteger с параметром ENUM_ORDER_PROPERTY_INTEGER  https://www.mql5.com/ru/docs/constants/tradingconstants/orderproperties#enum_order_property_integer

Но , что то нет там такого. Может другие способы есть ?

Так отложенного ордера или всё-таки позиции?