Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Стохастический Осциллятор (Stochastic Oscillator). 13 страница




Если необходимо сделать выбор между двумя ордерами, открытыми на одинаковое количество лотов, то следует принять во внимание другие характеристики ордеров. Например, можно учитывать дистанцию между текущей ценой и заявленным значением StopLoss каждого из ордеров. При этом необходимо проанализировать какой из ордеров принесёт больше вреда при сильном движении цены. Ответ также очевиден - больше вреда будет от того ордера (из двух ордеров, открытых на одинаковое количество лотов), StopLoss которого находится дальше от текущей цены.

Подобным образом можно проанализировать важность и всех других характеристик ордера и составить приоритетный список критериев, которые должны приниматься во внимание при решении задачи закрытия ордеров. Нетрудно также определить и критерии, которые не должны рассматриваться. Таким критерием является, например, цена открытия ордера (и зависимая от неё прибыль по ордеру). Количество денежных средств, имеющихся у трейдера на текущий момент, отражается в клиентском терминале в графе Средства. При этом не важно каким образом было получено это значение - то ли в результате убытка по одному или нескольким рыночным ордерам, то ли в результате прибыли.

Все необходимые характеристики ордера можно получить, исполнив соответствующие торговые функции:

Торговые функции

 

Функция Краткое описание
Ошибки исполнения Любая торговая операция (функции OrderSend, OrderClose, OrderCloseBy, OrderDelete или OrderModify) по ряду причин может завершиться неудачей и вернуть либо отрицательный номер тикета, либо FALSE. Причину неудачи можно выяснить, вызвав функцию GetLastError. Каждая ошибка должна быть обработана по-своему. Ниже в таблице приведены общие рекомендации.
OrderClose Закрытие позиции. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции.
OrderCloseBy Закрытие одной открытой позиции другой позицией, открытой по тому же самому инструменту, но в противоположном направлении. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции.
OrderClosePrice Возвращает цену закрытия выбранного ордера.
OrderCloseTime Возвращает время закрытия для выбранного ордера.
OrderComment Возвращает комментарий для выбранного ордера.
OrderCommission Возвращает значение рассчитанной комиссии для выбранного ордера.
OrderDelete Удаляет ранее установленный отложенный ордер. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции.
OrderExpiration Возвращает дату истечения для выбранного отложенного ордера.
OrderLots Возвращает количество лотов для выбранного ордера.
OrderMagicNumber Возвращает идентификационное ("магическое") число для выбранного ордера.
OrderModify Изменяет параметры ранее открытых позиций или отложенных ордеров. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции.
OrderOpenPrice Возвращает цену открытия для выбранного ордера.
OrderOpenTime Возвращает время открытия выбранного ордера.
OrderPrint Выводит данные ордера в журнал.
OrderProfit Возвращает значение чистой прибыли (без учёта свопов и комиссий) для выбранного ордера. Для открытых позиций это - текущая нереализованная прибыль. Для закрытых ордеров - зафиксированная прибыль.
OrderSelect Функция выбирает ордер для дальнейшей работы с ним. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции.
OrderSend Основная функция, используемая для открытия позиции или установки отложенного ордера. Возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи.
OrdersHistoryTotal Возвращает количество закрытых позиций и удаленных ордеров в истории текущего счета, загруженной в клиентском терминале.
OrderStopLoss Возвращает значение цены закрытия позиции при достижении уровня убыточности (stop loss) для текущего выбранного ордера.
OrdersTotal Возвращает общее количество открытых и отложенных ордеров.
OrderSwap Возвращает значение свопа для текущего выбранного ордера.
OrderSymbol Возвращает наименование финансового инструмента для текущего выбранного ордера.
OrderTakeProfit Возвращает значение цены закрытия позиции при достижении уровня прибыльности (take profit) для текущего выбранного ордера.
OrderTicket Возвращает номер тикета для текущего выбранного ордера.
OrderType Возвращает тип операции текущего выбранного ордера.

 

Для получения подробного описания этих и других функций необходимо обратиться к справочной документации на MQL4.community, сайте MetaQuotes Software Corp. или к разделу "Справка" в редакторе MetaEditor.

Построение обычных программ

 

Как правило, после самостоятельного программирования нескольких простых прикладных программ на MQL4, программист переходит к более сложному проекту - созданию удобной программы для практического использования. Простые программы в ряде случаев не удовлетворяют потребностям трейдера-программиста по крайней мере по двум причинам:

1. Функциональная ограниченность простых программ не позволяет в полной мере обеспечить трейдера необходимой информацией и средствами управления торговлей, что делает их применение недостаточно эффективным.

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

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

Структура обычной программы
Наличие множества пользовательских функций в программе позволяет создавать мощные и гибкие алгоритмы обработки информации. Директива компилятору #include позволяет однажды написанную и отлаженную функцию использовать и в других программах. Таким образом можно создавать свои собственные библиотеки или пользоваться открытыми разработками других программистов.

Учёт ордеров
Рассматривается пример пользовательской функции Terminal(), которая реализована в отдельном включаемом файле с расширением mqh. Такие файлы подключаются к коду программы на этапе компиляции с помощью директивы #include.

Информационная функция
Пример еще одной пользовательской функции, которая помогает организовать вывод текстовой информации о текущей работе эксперта. Эта функция позволяет отказаться от функции Comment() для вывода текста в главное окно графика, и реализована как индикатор в отдельном подокне ценового графика.

Функция слежения за событиями
Не всегда трейдер может заметить все события самостоятельно. Программа на MQL4 позволит обнаруживать изменения любых торговых условий или ситуаций. Пользовательская функция Events() подключается к эксперту с помощью директивы #include, и использует вызовы другой подключаемой функции Inform().

Функция определения количества лотов
Расчет объема открываемой позиции является одной из задач управления капиталом и рисками. Пользовательская функция Lot() является небольшим примером для этих целей.

Функция определения торговых критериев
Самая важная часть любой торговой стратегии - определение моментов входа в позицию и выхода из нее. Создание торговых правил или критериев является ядром любого экперта. Пользовательская функция Criterion() подключается с помощью директивы #include. В ней показано, как на основании значений индикаторов эксперт может принимать решение о соответствии текущей ситуации тому или иному критерию.

Торговые функции
Текущая ситуация проанализирована функцией Criterion(), и теперь необходимо произвести торговые операции: открытие, закрытие, модификацию или удаление отложенного ордера. Все эти операции можно вынести в отдельные пользовательские функции Trade(), Close_All() и Open_Ord(). Подтягивание защитных стопов производится еще одной пользовательской функцией Tral_Stop().

Функция обработки ошибок
Контроль ошибок является неотъемлемой частью любого эксперта. Вы сами определяете, каким образом обрабатывается сообщение о занятом торговом потоке, отсутствии цен по запрашиваемому инструменту и так далее. В одних случаях достаточно вывести сообщение о полученной ошибке, в других стоит попытаться повторить торговый приказ через некоторое время. Необходимо определить, как будет обрабатываться та или иная ошибка. В пользовательской функции Errors() показана обработка ошибок с помощью оператора выбора switch().

Структура обычной программы

 

Основной отличительной особенностью обычной программы является её структура, позволяющая легко применять те или иные пользовательские функции. Обычно для удобства пользовательские функции оформляются в виде включаемых файлов (.mqh), которые хранятся в каталоге Каталог_терминала\experts\include.

Как правило, обычная программа содержит все три специальные функции, которые вызывают для исполнения необходимые пользовательские функции. Пользовательские функции, в свою очередь, могут вызывать для исполнения другие пользовательские функции, при этом каждая из них имеет своё функционально ограниченное назначение.

В составе эксперта могут применяться пользовательские функции с самыми разнообразными свойствами. Одни функции, например, предназначены для отслеживания событий и удобного вывода информации, другие - для формирования торговых приказов, третьи - для различных вычислений, например, определения торговых критериев, вычисления стоимости ордеров и т.д. Решение о том, какие функции использовать в программе, зависит от назначения эксперта и от того, какой сервис программа должна предоставлять пользователю. На рис. 155 приведена структурная схема обычного торгующего эксперта, построенного на небольшом наборе пользовательских функций.

 


Рис. 155. Структурная схема обычной программы (эксперт).

 

Стрелками на структурной схеме показаны связи между различными функциями. Например, функция учёта ордеров вызывается в эксперте из специальной функции init(), специальной функции start(), а также может быть вызвана из любого другого места места программы. В правой части схемы показаны стрелки связей, символизирующие возможность вызова одной пользовательской функции из другой. Например, функция определения торговых критериев не вызывается ни из одной специальной функции, но может быть вызвана для исполнения торговой функцией. Информационная функция вызывается из специальной функции deinit(), а также при необходимости вызывается другими функциями, например, функцией обработки ошибок, торговыми функциями, функцией слежения за событиями. Включаемый файл объявления переменных не вызывается ни из одной функции, потому что имеющийся в нём код не является описанием функции, которая может быть вызвана и исполнена. Этот файл содержит строки объявления глобальных переменных, поэтому просто является составной частью эксперта. Для того чтобы понять, каким образом различные части эксперта взаимодействуют между собой, рассмотрим порядок создания и использования включаемых файлов.

Использование включаемых файлов

 

Если прикладная программа содержит множество программных строк, то её отладка бывает затруднительной - программисту приходится многократно прокручивать текст программы, чтобы внести изменения в код в том или ином месте. В подобных случаях для удобства программа может быть разделена на несколько фрагментов, каждый из которых оформляется в виде отдельного включаемого файла. Включаемые файлы могут содержать любой фрагмент кода, который предполагается использовать в программе. Обычно каждая используемая в программе функция оформляется в виде включаемого файла. Если несколько функций логически связаны между собой, то содержанием одного включаемого файла может быть описание нескольких пользовательских функций.

В разделе Информация о счёте рассматривался пример защитного кода, предотвращающего несанкционированное использование коммерческих программ. В эксперте check.mq4 соответствующая часть программного кода представлена в виде пользовательской функции Check(), описание которой содержится непосредственно в исходном тексте эксперта. В эксперте usualexpert.mq4 (см. рис. 91.3) также используется эта функция, но в этом случае функция оформлена в виде включаемого файла Check.mqh.

Пользовательская функция Check()

bool Check()

Функция возвращает TRUE, если соблюдены условия использования прикладной программы, возвращает FALSE, если условия не соблюдены.

Условия использования программы считаются выполненными, если:

программа используется на демо-счёте;

счёт открыт в компании SuperBank;

при работе на реальном счёте пользователь установил правильное значение внешней переменной Parol.

Включаемый файл Check.mqh, содержащий описание пользовательской функции Check():

//--------------------------------------------------------------------

// Check.mqh

// Предназначен для использования в качестве примера в учебнике MQL4.

//--------------------------------------------------------------- 1 --

// Функция проверки легальности использования программы

// Входные параметры:

// - глобальная переменная Parol

// - локальная константа "SuperBank"

// Возвращаемые значения:

// true - если условия использования соблюдены

// false - если условия использования нарушены

//--------------------------------------------------------------- 2 --

extern int Parol=12345; // Пароль для работы на реальном счёте

//--------------------------------------------------------------- 3 --

bool Check() // Пользовательская функция

{

if (IsDemo()==true) // Если это демо-счёт, то..

return(true); //.. других ограничений нет

if (AccountCompany()=="SuperBank") // Для корпоративных клиентов..

return(true); //..пароль не нужен

int Key=AccountNumber()*2+1000001; // Вычисляем ключ

if (Parol==Key) // Если пароль верный, то..

return(true); //..разрешаем работу на реале

Inform(14); // Сообщение о несанкц. работе

return(false); // Выход из пользов. функции

}

//--------------------------------------------------------------- 4 --

Легко заметить, что название включаемого файла совпадает с названием содержащейся в нём функции. Правилами языка MQL4 такое требование не предусмотрено. В общем случае название включаемого файла не обязательно должно совпадать с названием функции, которая в нём содержится. Тем более это понятно, если учесть, что один файл может нести описание нескольких функций или какого-либо фрагмента программы, вообще не являющегося функцией. Однако практика присваивать включаемому файлу имя, совпадающее с именем описанной в нём функции, оправданна. При этом значительно облегчается труд программиста: он легко может понять, какие функции имеются в каталоге Каталог_терминала\experts\include, ориентируясь по именам файлов. Для того чтобы фрагмент программы, содержащийся в файле, включить в программу, используется директива #include.

Директива #include

 

#include <Имя файла> #include "Имя файла"

Директива #include может быть указана в любом месте программы, но обычно все включения размешаются в начале файла исходного текста. Препроцессор заменяет строку #include <имя_файла> (или строку #include "имя_файла") содержимым файла с указанным именем.

Угловые скобки обозначают, что файл будет взят из стандартного каталога Каталог_терминала\experts\include (текущий каталог не просматривается). Если имя файла заключено в кавычки, то поиск производится в текущем каталоге, а именно в том, в котором содержится основной файл исходного текста (стандартный каталог не просматривается).

Ниже представлен обычный эксперт usualexpert.mq4. Все включаемые файлы размещены в головной части программы.

//--------------------------------------------------------------------

// usualexpert.mq4

// Предназначен для использования в качестве примера в учебнике MQL4.

//--------------------------------------------------------------- 1 --

#property copyright "Copyright © Book, 2007"

#property link "http://AutoGraf.dp.ua"

//--------------------------------------------------------------- 2 --

#include <stdlib.mqh>

#include <stderror.mqh>

#include <WinUser32.mqh>

//--------------------------------------------------------------- 3 --

#include <Variables.mqh> // Описание переменных

#include <Check.mqh> // Проверка легальности использов. программ

#include <Terminal.mqh> // Учёт ордеров

#include <Events.mqh> // Функция слежения за событиями, обновлен.

#include <Inform.mqh> // Информационная функция

#include <Trade.mqh> // Торговая функция

#include <Open_Ord.mqh> // Открытие одного ордера заданного типа

#include <Close_All.mqh> // Закрытие всех ордеров заданного типа

#include <Tral_Stop.mqh> // Модификация StopLoss всех ордеров типа

#include <Lot.mqh> // Вычисление количества лотов

#include <Criterion.mqh> // Торговые критерии

#include <Errors.mqh> // Функция обработки ошибок.

//--------------------------------------------------------------- 4 --

int init() // Спец. функция init

{

Level_old=MarketInfo(Symbol(),MODE_STOPLEVEL);//Миним. дистаниция

Terminal(); // Функция учёта ордеров

return; // Выход из init()

}

//--------------------------------------------------------------- 5 --

int start() // Спец. функция start

{

if(Check()==false) // Если условия использования..

return; //..не выполняются, то выход

PlaySound("tick.wav"); // На каждом тике

Terminal(); // Функция учёта ордеров

Events(); // Информация о событиях

Trade(Criterion()); // Торговая функция

Inform(0); // Для перекрашивания объектов

return; // Выход из start()

}

//--------------------------------------------------------------- 6 --

int deinit() // Спец. функция deinit()

{

Inform(-1); // Для удаления объектов

return; // Выход из deinit()

}

//--------------------------------------------------------------- 7 --

В блоке 2-3 с помощью директивы #include в программу включены стандартные файлы stdlib.mqh, stderror.mqh и WinUser32.mqh. Использование этих файлов в программе бывает необходимо не всегда. Например, файл stderror.mqh содержит определение стандартных констант, используемых при обработке ошибок. Если в программе не предусмотрен анализ ошибок (указанные константы не используются), то включать этот фал в исходный текст нет необходимости. Вместе с тем, в обычной программе, как правило, требуется использование указанных файлов.

В блоке 3-4 в программу включены несколько файлов, содержащих описание пользовательских функций. В том числе, с помощью директивы #include, в строке:

#include <Check.mqh> // Проверка легальности использов. программ

в исходный текст программы включается пользовательская функция Check(). Программист видит исходный текст эксперта (в данном случае - usualexpert.mq4) таким, каким он представлен выше. Однако при компиляции исходный текст программы преобразуется, а именно: вместо каждой строки, содержащей директиву #include, в программу вставляется текст, содержащийся в файле с указанным именем. Таким образом, исполняемый файл.ex4 создаётся на основе полного кода эксперта, в котором вместо каждой строки #include<Имя файла> (или #include "Имя файла") содержится соответствующий фрагмент кода.

Примером включаемого файла, в котором содержится некоторый фрагмент программы, не являющийся описанием функции, может служить файл Variables.mqh. Этот файл включается в текст программы в строке:

#include <Variables.mqh> // Описание переменных

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

//--------------------------------------------------------------------

// Variables.mqh

// Предназначен для использования в качестве примера в учебнике MQL4.

//--------------------------------------------------------------- 1 --

// Описание глобальных переменных

extern double Lots = 0.0;// Количество лотов

extern int Percent = 0; // Процент выделенных средств

extern int StopLoss =100; // StopLoss для новых ордеров (пунктов)

extern int TakeProfit =40; // TakeProfit для новых ордеров (пунктов)

extern int TralingStop=100; // TralingStop для рыночных ордеров (пунк)

//--------------------------------------------------------------- 2 --

int

Level_new, // Новое значение минимальной дистанции

Level_old, // Предыдущее значение минимальной дистанции

Mas_Tip[6]; // Массив типов ордеров

// [] тип орд: 0=B,1=S,2=BL,3=SL,4=BS,5=SS

//--------------------------------------------------------------- 3 --

double

Lots_New, // Количество лотов для новых ордеров

Mas_Ord_New[31][9], // Массив ордеров текущий..

Mas_Ord_Old[31][9]; //.. и старый

// 1й индекс = порядковый номер ордера

// [][0] не определяется

// [][1] курс откр. ордера (абс.знач.курса)

// [][2] StopLoss ордера (абс.знач.курса)

// [][3] TakeProfit ордера (абс.знач.курса)

// [][4] номер ордера

// [][5] колич. лотов орд. (абс.знач.курса)

// [][6] тип орд. 0=B,1=S,2=BL,3=SL,4=BS,5=SS

// [][7] магическое число ордера

// [][8] 0/1 факт наличия комментария

//--------------------------------------------------------------- 4 --

В соответствии с правилами MQL4 объявление любой, в том числе и глобальной, переменной должно осуществляться до первого обращения к этой переменной. По этой причине файл Variables.mqh включён в программу раньше (выше по тексту), чем файлы функций, использующих значения указанных в этом файле переменных. По этой же причине в этот файл вынесены все глобальные переменные.

В некоторых (редких) случаях имеется техническая возможность объявить глобальную переменную во включаемом файле, описывающем функцию, в которой впервые в программе используется значение этой переменной. В таких случаях необходимо следить за порядком включения файлов. Т.е. требуется, чтобы программная строка с директивой #include, включающей файл (с объявлением глобальной переменной) в программу, находилась выше по тексту, чем строки, включающие другие файлы, где используется значение этой глобальной переменной.

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

В блоке 1-2 включаемого файла Variables.mqh указаны внешние переменные, значения которых определяют количество лотов для новых ордеров, процент свободных средств, выделенный для новых ордеров, заявленные цены для стоп-приказов открываемых рыночных ордеров, а также дистанцию TralingStop для модификации StopLoss ордера. В блоках 2-4 указаны другие глобальные переменные, смысл которых будет понятен при рассмотрении соответствующих пользовательских функций. В следующих разделах главы представлены включаемые файлы, каждый из которых содержит описание одноимённой пользовательской функции.

Учёт ордеров

 

Ранее упоминалось, что каких-либо жёстких правил для составления алгоритмов программ не существует. Вместе с тем, подавляющее большинство алгоритмов предполагает принятие торговых решений в зависимости от текущего состояния ордеров. В одних случаях, например, для открытия рыночного ордера требуется, чтобы на момент осуществления торговой операции других рыночных ордеров не было. В других случаях, для установки отложенного ордера необходимым условием может являться отсутствие стоп-приказов на рыночном ордере. Известны также алгоритмы, предполагающие установку одновременно двух разнонаправленных отложенных ордеров.

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

В соответствии с первым вариантом необходимый фрагмент программного кода (в котором выполняется анализ ордеров) прописывается непосредственно в том месте программы, где нужно выяснить текущий набор ордеров и их характеристики. Такое решение технически осуществимо, но оказывается неэффективным, когда необходимо внести изменения в алгоритм. В этом случае программист вынужден анализировать все места программы, где анализируется состояние ордеров и вносить изменения в каждом месте. Второй, более эффективный вариант решения, заключается в том, чтобы один раз создать универсальную функцию учёта ордеров и использовать её всякий раз, когда требуется обновить информацию о текущем состоянии ордеров. Такое решение, с одной стороны, позволяет значительно сократить код программы, а с другой стороны, предоставляет программисту возможность использовать готовую функцию при составлении других программ.

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

общее количество ордеров;

количество ордеров каждого типа (например, сколько имеется ордеров Buy, сколько SellStop, BuyLimit и т.д.);

все характеристики каждого из ордеров (номер ордера, StopLoss и TakeProfit ордера, количество лотов и т.д.).

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

массив текущих ордеров Mas_Ord_New, содержащий сведения обо всех характеристиках всех рыночных и отложенных ордеров, имеющихся на текущий момент, а именно, в период последнего исполнения функции;

массив старых ордеров Mas_Ord_Old, содержащий сведения обо всех характеристиках всех рыночных и отложенных ордеров, имеющихся на момент предыдущего исполнения функции;

массив Mas_Tip, значениями которого являются количества ордеров различных типов (на текущий момент).

Массивы Mas_Ord_New и Mas_Ord_Old подобны и имеют одинаковую размерность; разница между ними заключается лишь в том, что первый из них отражает текущее состояние ордеров, а второй - предшествующее. Рассмотрим детально, какие значения содержатся в элементах этих массивов.

Таблица 4. Соответствие элементов массивов Mas_Ord_New и Mas_Ord_Old характеристикам ордеров.

  Не опред. Курс открытия StopLoss TakeProfit Номер ордера Колич. лотов Тип ордера Magic Number Коммент.
Индексы                  
  2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
  0.0 1.2583 1.2600 1.2550 123456.0 1.4 1.0 1177102416.0 1.0
  0.0 1.2450 1.2580 1.2415 123458.0 2.5 2.0 1177103358.0 0.0
  0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
  0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

Первый индекс массива (строки) определяет порядковый номер ордера в массиве. Характеристики первого обнаруженного ордера (среди открытых рыночных и установленных отложенных ордеров) заносятся в первую строку массива, второго ордера - во вторую строку и т.д. Размер массива по первому индексу равен 31, таким образом, массив предназначен для хранения информации максимум о тридцати ордерах, одновременно присутствующих в торговле по одному торговому счёту. В случае, если торговая стратегия допускает наличие одновременно более тридцати ордеров, то при объявлении массива необходимо указать соответствующее значение для первого индекса. (В подавляющем большинстве случаев значение 30 значительно превышает действительную потребность, которая может составлять от 2 до 10-15. Здесь для примера используется значение 30, принятое с большим запасом, в предположении, что функция может использоваться и в случае реализации своеобразной торговой стратегии).




Поделиться с друзьями:


Дата добавления: 2014-12-29; Просмотров: 356; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.098 сек.