Обсуждение статьи "Как использовать торговые классы Стандартной библиотеки при написании советника"

 

Опубликована статья Как использовать торговые классы Стандартной библиотеки при написании советника:

В статье рассказывается о том, как использовать основной функционал торговых классов Стандартной библиотеки при написании советников, в которых применяется открытие, закрытие и модификация позиции, проверка свободной маржи перед размещением торговых ордеров, размещение и удаление отложенных ордеров. Показано, как использовать торговые классы для получения свойств ордеров и сделок.

Автор: Samuel

 

Очень полезная статья для меня. Все намного проще если использовать библиотеки ! 

Просьба к разработчикам: напишите класс для работы с High[i] , Low[i]. Open[i], Close [i]. Я думаю всем будет полезен этот класс! Для себя я эту проблему решил, но не уверен что правильно, т.к. тестирование занимает много времени... 

 

Посмотрите раздел Группа классов таймсерий
 
#include <Indicators\Series.mqh>

double High[];
 CiHigh z;

почему такой код выдает ошибку 

'1.mq5' 1.mq5 1 1

'Series.mqh' Series.mqh 1 1

'ArrayObj.mqh' ArrayObj.mqh 1 1

'Array.mqh' Array.mqh 1 1

'Object.mqh' Object.mqh 1 1

'StdLibErr.mqh' StdLibErr.mqh 1 1

'ArrayDouble.mqh' ArrayDouble.mqh 1 1

'CiHigh' - declaration without type 1.mq5 12 2

1 error(s), 0 warning(s) 2 1

во всех примерах объявлять тип не надо...

 если не трудно напишете как получить

Print High[2], например.  

 
dimeon:

почему такой код выдает ошибку 


во всех примерах объявлять тип не надо...

 если не трудно напишете как получить

Print High[2], например.  

в документации опечатка. Этот класс в находится в файле TimeSeries.mqh.

Пример использования (скрипт выводит три последних High текущего графика):

#include <Indicators\TimeSeries.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double High[];
   CiHigh z;
   int count=3;
   if(z.Create(_Symbol,_Period)==true)
     {
      if(z.GetData(0,count,High)==count)
        {
         for(int i=0; i<count; i++) Print(i,"=",High[i]);
        }
      else
         Print("Не удалось получить ",count," данных таймсерии.");
     }
   else Print("Ошибка создания таймсерии.");
  }
//+------------------------------------------------------------------+
 
Quantum:

в документации опечатка. Этот класс в находится в файле TimeSeries.mqh.

Пример использования (скрипт выводит три последних High текущего графика):

Спасибо огромное !  а то я все мозги сломал ! 
 

прекрасно понимаю, что каждый программирует под себя и свои потребности, но мне в корне не нравятся Группа классов таймсерий, т.к. они по сути все состоят из одного метода и описательной части больше чем функционала, и обычно необходимо иметь сразу все таймсерии для конкретного инструмента, себе я сделал один класс в котором есть все таймсерии по необходимому инструменту, в методах производится подкачка истории, примерно так:

struct str_bars{
   datetime    time[];     // Массив-таймсерия, содержащий время открытия каждого бара текущего графика
   double      open[];     // Массив-таймсерия, содержащий цены открытия каждого бара текущего графика.
   double      close[];    // Массив-таймсерия, содержащий цены закрытия каждого бара текущего графика.
   double      high[];     // Массив-таймсерия, содержащий максимальные цены каждого бара текущего графика.
   double      low[];      // Массив-таймсерия, содержащий минимальные цены каждого бара текущего графика.
};
struct str_info{
   double   point;         // Размер пункта текущего инструмента в валюте котировки
   int      spread;        // Текущий спред
};
//____________________________________________________________________
class currency {
   public:
//---- данные      
      MqlTick TICK;        // тиковые данные
      str_bars  BAR;       // данные таймсерий
      str_info INFO;       // информация об инструменте
      int error;
//---- методы      
      int create(string sym,ENUM_TIMEFRAMES period, int numbars);
      int refresh(void);
   private:
      string            symbol;
      ENUM_TIMEFRAMES   per;
      int               num;
      datetime          lastbar_time;
      int               tmpint1,tmpint2;
      int ch_load(void);
};
//____________________________________________________________________

работаю со своим классом только в части уже готовых данных, ну и конечно класс самостоятельно получает данные путем вызова метода   refresh()

 
Полезная статья!
 

в статье неточность

double lot_price = myaccount.MarginCheck(_Symbol,otype,Lot); //цена лота/кол-во требуемой маржи

должно быть

   double lot_price=myaccount.MarginCheck(_Symbol,otype,Lot,price);  //--- цена лота/кол-во требуемой маржи

 

 

Отлчная статья. Большое спасибо автору. Еще бы написать проверку уровня Stop_Level перед размещением ордера, проверку значения спреда. Дело в том, что если спред плавающий, то при больших значениях можно не входить в рынок, т.к. это не выгодго. Это поможет советнику не торговать во время новостей. Еше провеку на отклонение хочется - рассуждения аналогичные. И еще есть вопрос по библиотеке: что такое функция (что за процесс она обозначает и описывает)?

FreezeLevel

Получает дистанцию заморозки торговых операций в пунктах.

int  FreezeLevel() const

простым языком - объясните, пожалуйста, кто знает.

И еще один вопрос. Мы можем узнать ограничения, например, Stop_Level на текущий момент(пусть 10 пунктов). Выставляем отложенный ордер со значением SL=10 пунктов. Через, к примеру час цена достигает указанной в ордере цены, но Stop_Level на этот момент равен, например 15п. Что будет - сработает отложенный ордер или будет отклонен? Кроме того, когда цена достигает указанной в ордере цены, а спред изменился - значит ли это, что вход или выход возможен по худшей цене, по отношению к той предполагаемой, что была на момент открытия ордера, или ордер вообще не сработает?

 

подскажите что я неправильно делаю ? почему Bid не печатается ?

Вот лог работы


2011.01.31 20:20:18 00 (EURUSD,M1) EURUSD 0

вот код

#include <Trade\SymbolInfo.mqh>  //--- Класс CSymbolInfo
CSymbolInfo    my_symbol;        //--- Объект класса CSymbolInfo
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {   return(0);  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   my_symbol.Name(_Symbol);
   my_symbol.Refresh();
   Print(_Symbol," ",my_symbol.Bid());
  }
//+------------------------------------------------------------------+