MQL4 - automated forex trading   /  

Форум

Как использовать функцию AllOrdersControl?

К списку тем  | 1 2 Авторизуйтесь или зарегистрируйтесь, чтобы создать новую тему

avatar
142
Vyacheslav 29.09.2006 13:10 

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

В системе используются ордера по двум магическим числам, предположим

Magic1=100

Magic2=200

С магическим числом Magic1 могут быть ордера двух типов OP_BUY или OP_BUYSTOP.

С магическим числом Magic2 - OP_SELL или OP_SELLSTOP.

В процессе торгов в рынке могут быть только 3 комбинации ордеров:

1. OrderType() ==OP_BUY и OrderType() ==OP_SELLSTOP
2. OrderType() == OP_SELL и OrderType() == OP_BUYSTOP

3. OrderType() ==OP_BUY и OrderType() == OP_SELL

Далее…

При возникновении комбинации под №3 OrderType() ==OP_BUY и OrderType() == OP_SELL срабатывает функция которая увеличивает абсолютное значение на +1 обоих магиков, в последующем, с поступлением сигналов на покупку или продажу выставляются ордера указанных 3-х комбинаций, но уже с другими значениями магических чисел, пример:

Magic1=1001....

Magic2=2001...

И так далее…

Вопрос. Что необходимо подправить в данной функции для наиболее рационального и правильного ее использования в стартовой функции в моем примере?

//+------------------------------------------------------------------+
//|                                             AllOrdersControl.mq4 |
//|                                      Copyright © 2006, komposter |
//|                                      mailto:komposterius@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, komposter"
#property link      "mailto:komposterius@mail.ru"
 
// переменная, которая будет хранить количество ордеров, принадлежащих эксперту:
int _ExpertOrdersTotal = 0;
 
// массивы, в которых будут хранитсья характеристики ордеров:
int _OrderTicket[], _OrderType[];
double _OrderLots[], _OrderOpenPrice[], _OrderStopLoss[], _OrderTakeProfit[];
double _OrderProfit[], _OrderSwap[], _OrderCommission[];
datetime _OrderOpenTime[], _OrderExpiration[];
string _OrderComment[];
 
void AllOrdersInit( int magic )
{
    int _GetLastError = 0, _OrdersTotal = OrdersTotal();
    _ExpertOrdersTotal = 0;
 
    // изменяем размеры массивов под текущее кол-во позиций
    // (если _OrdersTotal = 0, меняем размер массивов на 1)
    int temp_value = MathMax( _OrdersTotal, 1 );
    ArrayResize( _OrderTicket,            temp_value );
    ArrayResize( _OrderType,            temp_value );
    ArrayResize( _OrderLots,            temp_value );
    ArrayResize( _OrderOpenPrice,        temp_value );
    ArrayResize( _OrderStopLoss,        temp_value );
    ArrayResize( _OrderTakeProfit,    temp_value );
    ArrayResize( _OrderOpenTime,        temp_value );
    ArrayResize( _OrderProfit,            temp_value );
    ArrayResize( _OrderSwap,            temp_value );
    ArrayResize( _OrderCommission,    temp_value );
    ArrayResize( _OrderComment,        temp_value );
    ArrayResize( _OrderExpiration,    temp_value );
 
    // обнуляем массивы
    ArrayInitialize( _OrderTicket,        0 );
    ArrayInitialize( _OrderType,            0 );
    ArrayInitialize( _OrderLots,            0 );
    ArrayInitialize( _OrderOpenPrice,    0 );
    ArrayInitialize( _OrderStopLoss,        0 );
    ArrayInitialize( _OrderTakeProfit,    0 );
    ArrayInitialize( _OrderOpenTime,        0 );
    ArrayInitialize( _OrderProfit,        0 );
    ArrayInitialize( _OrderSwap,            0 );
    ArrayInitialize( _OrderCommission,    0 );
    ArrayInitialize( _OrderExpiration,    0 );
 
    for ( int z = _OrdersTotal - 1; z >= 0; z -- )
    {
        if ( !OrderSelect( z, SELECT_BY_POS ) )
        {
            _GetLastError = GetLastError();
            Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError );
            continue;
        }
        if ( OrderMagicNumber() == magic && OrderSymbol() == Symbol() )
        {
            // заполняем массивы
            _OrderTicket        [_ExpertOrdersTotal] = OrderTicket();
            _OrderType            [_ExpertOrdersTotal] = OrderType();
            _OrderLots            [_ExpertOrdersTotal] = NormalizeDouble( OrderLots(), 1 );
            _OrderOpenPrice    [_ExpertOrdersTotal] = NormalizeDouble( OrderOpenPrice(), Digits );
            _OrderStopLoss        [_ExpertOrdersTotal] = NormalizeDouble( OrderStopLoss(), Digits );
            _OrderTakeProfit    [_ExpertOrdersTotal] = NormalizeDouble( OrderTakeProfit(), Digits );
            _OrderOpenTime        [_ExpertOrdersTotal] = OrderOpenTime();
            _OrderProfit        [_ExpertOrdersTotal] = NormalizeDouble( OrderProfit(), 2 );
            _OrderSwap            [_ExpertOrdersTotal] = NormalizeDouble( OrderSwap(), 2 );
            _OrderCommission    [_ExpertOrdersTotal] = NormalizeDouble( OrderCommission(), 2 );
            _OrderComment        [_ExpertOrdersTotal] = OrderComment();
            _OrderExpiration    [_ExpertOrdersTotal] = OrderExpiration();
            _ExpertOrdersTotal ++;
        }
    }
 
    // изменяем размеры массивов под кол-во позиций, принадлежащих эксперту
    // (если _ExpertOrdersTotal = 0, меняем размер массивов на 1)
    temp_value = MathMax( _ExpertOrdersTotal, 1 );
    ArrayResize( _OrderTicket,            temp_value );
    ArrayResize( _OrderType,            temp_value );
    ArrayResize( _OrderLots,            temp_value );
    ArrayResize( _OrderOpenPrice,        temp_value );
    ArrayResize( _OrderStopLoss,        temp_value );
    ArrayResize( _OrderTakeProfit,    temp_value );
    ArrayResize( _OrderOpenTime,        temp_value );
    ArrayResize( _OrderProfit,            temp_value );
    ArrayResize( _OrderSwap,            temp_value );
    ArrayResize( _OrderCommission,    temp_value );
    ArrayResize( _OrderComment,        temp_value );
    ArrayResize( _OrderExpiration,    temp_value );
}

Функция взята из темы статьи: «Управление ордерами – это просто»

'Управление ордерами – это просто'

автор mailto: komposterius[@]mail[.]ru.



С уважением, Вячеслав.

Увеличьте эффективность групповой работы

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


avatar
14054
komposter 29.09.2006 14:35 
Мне кажется, менять надо не функцию, а логику эксперта ;)
- Зачем менять мейджик?
- Зачем изначально использовать 2 мейджика?

avatar
142
Vyacheslav 29.09.2006 14:42 

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

// глобальные переменные, в которых будут хранитсья характеристики ордеров:
int _BuyTicket = 0, _SellTicket = 0, _BuyStopTicket = 0;
int _SellStopTicket = 0, _BuyLimitTicket = 0, _SellLimitTicket = 0;
 
double _BuyLots = 0.0, _SellLots = 0.0, _BuyStopLots = 0.0; 
double _SellStopLots = 0.0, _BuyLimitLots = 0.0, _SellLimitLots = 0.0;
 
double _BuyOpenPrice = 0.0, _SellOpenPrice = 0.0, _BuyStopOpenPrice = 0.0;
double _SellStopOpenPrice = 0.0, _BuyLimitOpenPrice = 0.0, _SellLimitOpenPrice = 0.0;
 
double _BuyStopLoss = 0.0, _SellStopLoss = 0.0, _BuyStopStopLoss = 0.0;
double _SellStopStopLoss = 0.0, _BuyLimitStopLoss = 0.0, _SellLimitStopLoss = 0.0;
 
double _BuyTakeProfit = 0.0, _SellTakeProfit = 0.0, _BuyStopTakeProfit = 0.0;
double _SellStopTakeProfit = 0.0, _BuyLimitTakeProfit = 0.0, _SellLimitTakeProfit = 0.0;
 
datetime _BuyOpenTime = -1, _SellOpenTime = -1, _BuyStopOpenTime = -1;
datetime _SellStopOpenTime = -1, _BuyLimitOpenTime = -1, _SellLimitOpenTime = -1;
 
double _BuyProfit = 0.0, _SellProfit = 0.0, _BuySwap = 0.0, _SellSwap = 0.0;
double _BuyCommission = 0.0, _SellCommission = 0.0;
 
string _BuyComment = "", _SellComment = "", _BuyStopComment = ""; 
string _SellStopComment = "", _BuyLimitComment = "", _SellLimitComment = "";
 
datetime _BuyStopExpiration = -1, _SellStopExpiration = -1;
datetime _BuyLimitExpiration = -1, _SellLimitExpiration = -1;
 
void OneTypeOrdersInit1( int magic1 )
{
// обнуление переменных:
    _BuyTicket = 0; _BuyStopTicket = 0;
 
    _BuyLots = 0.0;  _BuyStopLots = 0.0; 
 
    _BuyOpenPrice = 0.0;  _BuyStopOpenPrice = 0.0;
 
    _BuyStopLoss = 0.0;  _BuyStopStopLoss = 0.0;
 
    _BuyTakeProfit = 0.0; _BuyStopTakeProfit = 0.0;
 
    _BuyOpenTime = -1; _BuyStopOpenTime = -1;
 
    _BuyProfit = 0.0;  _BuySwap = 0.0; 
    _BuyCommission = 0.0; 
 
    _BuyComment = ""; _BuyStopComment = ""; 
 
    _BuyStopExpiration = -1; 
 
    int _GetLastError = 0, _OrdersTotal = OrdersTotal();
    for ( int z = _OrdersTotal - 1; z >= 0; z -- )
    {
        if ( !OrderSelect( z, SELECT_BY_POS ) )
        {
            _GetLastError = GetLastError();
            Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError );
            continue;
        }
        if ( OrderMagicNumber() == magic1 && OrderSymbol() == Symbol() )
        {
            switch ( OrderType() )
            {
                case OP_BUY:
                    _BuyTicket     = OrderTicket();
                    _BuyLots       = NormalizeDouble( OrderLots(), 1 );
                    _BuyOpenPrice  = NormalizeDouble( OrderOpenPrice(), Digits );
                    _BuyStopLoss   = NormalizeDouble( OrderStopLoss(), Digits );
                    _BuyTakeProfit = NormalizeDouble( OrderTakeProfit(), Digits );
                    _BuyOpenTime   = OrderOpenTime();
                    _BuyProfit     = NormalizeDouble( OrderProfit(), 2 );
                    _BuySwap       = NormalizeDouble( OrderSwap(), 2 );
                    _BuyCommission = NormalizeDouble( OrderCommission(), 2 );
                    _BuyComment    = OrderComment();
                    break;
                case OP_BUYSTOP:
                    _BuyStopTicket     = OrderTicket();
                    _BuyStopLots       = NormalizeDouble( OrderLots(), 1 );
                    _BuyStopOpenPrice  = NormalizeDouble( OrderOpenPrice(), Digits );
                    _BuyStopStopLoss   = NormalizeDouble( OrderStopLoss(), Digits );
                    _BuyStopTakeProfit = NormalizeDouble( OrderTakeProfit(), Digits );
                    _BuyStopOpenTime   = OrderOpenTime();
                    _BuyStopComment    = OrderComment();
                    _BuyStopExpiration = OrderExpiration();
                    break;
            }
        }
    }
}
void OneTypeOrdersInit2( int magic2 )
{
// обнуление переменных:
     _SellTicket = 0; _SellStopTicket = 0;
 
    _SellLots = 0.0; _SellStopLots = 0.0; 
 
    _SellOpenPrice = 0.0;_SellStopOpenPrice = 0.0; 
 
    _SellStopLoss = 0.0; _SellStopStopLoss = 0.0; 
 
    _SellTakeProfit = 0.0;_SellStopTakeProfit = 0.0; 
 
     _SellOpenTime = -1; _SellStopOpenTime = -1; 
 
    _SellProfit = 0.0;  _SellSwap = 0.0;
    _SellCommission = 0.0;
 
    _SellComment = "";_SellStopComment = ""; 
 
    _SellStopExpiration = -1;
 
    int _GetLastError = 0, _OrdersTotal = OrdersTotal();
    for ( int z = _OrdersTotal - 1; z >= 0; z -- )
    {
        if ( !OrderSelect( z, SELECT_BY_POS ) )
        {
            _GetLastError = GetLastError();
            Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError );
            continue;
        }
        if ( OrderMagicNumber() == magic2 && OrderSymbol() == Symbol() )
        {
            switch ( OrderType() )
            {
                case OP_SELL:
                    _SellTicket     = OrderTicket();
                    _SellLots       = NormalizeDouble( OrderLots(), 1 );
                    _SellOpenPrice  = NormalizeDouble( OrderOpenPrice(), Digits );
                    _SellStopLoss   = NormalizeDouble( OrderStopLoss(), Digits );
                    _SellTakeProfit = NormalizeDouble( OrderTakeProfit(), Digits );
                    _SellOpenTime   = OrderOpenTime();
                    _SellProfit     = NormalizeDouble( OrderProfit(), 2 );
                    _SellSwap       = NormalizeDouble( OrderSwap(), 2 );
                    _SellCommission = NormalizeDouble( OrderCommission(), 2 );
                    _SellComment    = OrderComment();
                    break;
                case OP_SELLSTOP:
                    _SellStopTicket     = OrderTicket();
                    _SellStopLots       = NormalizeDouble( OrderLots(), 1 );
                    _SellStopOpenPrice  = NormalizeDouble( OrderOpenPrice(), Digits );
                    _SellStopStopLoss   = NormalizeDouble( OrderStopLoss(), Digits );
                    _SellStopTakeProfit = NormalizeDouble( OrderTakeProfit(), Digits );
                    _SellStopOpenTime   = OrderOpenTime();
                    _SellStopComment    = OrderComment();
                    _SellStopExpiration = OrderExpiration();
                    break;
            }
        }
    }
}

Если "таможня" дает добро, то прошу три "зеленых" свистка. ...
С уважением, Вячеслав.


avatar
142
Vyacheslav 29.09.2006 17:25 
komposter писал (а):
Мне кажется, менять надо не функцию, а логику эксперта ;)
- Зачем менять мейджик?
- Зачем изначально использовать 2 мейджика?

Вы знаете, вы правы!
Спасибо.

С уважением, Вячеслав.

avatar
142
Vyacheslav 02.10.2006 16:06 
Vyacheslav писал (а):
komposter писал (а):
Мне кажется, менять надо не функцию, а логику эксперта ;)
- Зачем менять мейджик?
- Зачем изначально использовать 2 мейджика?

Вы знаете, вы правы!
Спасибо.

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

#include <OneTypeOrdersControl.mq4>
#include <OneTypeOrdersControl1.mq4>
#include <OneTypeOrdersControl2.mq4>

extern int _MagicNumber = 1111;
extern int _MagicNumber1 = 2222;
extern int _MagicNumber2 = 3333;


int start()
{
bool First=false;
bool Second=false;
bool Third=false;
if ( First=false ) OneTypeOrdersInit( _MagicNumber );
Сначала я работаю с ордерами данного магического числа и как только First=true
мне необходимо запустить вторую функцию для работы с другим магическим числом
(одновременно работают ордера обоих магических чисел)
if (First==true) OneTypeOrdersInit1 ( _MagicNumber1 );
Как только Second=true запускается третья группа со своим магическим числом
(теоретически и практически возможна работа одновременно ордеров всех трех групп)
if (Second==true) OneTypeOrdersInit2 ( _MagicNumber2 );
И только с закрытием всех ордеров группы с магическим числом _MagicNumber
if ( _SellTicket==0 && _BuyTicket ==0 &&_SellStopTicket==0 &&_BuyStopTicket==0) First=false;
включается в работу заново данная группа
if (Third==true ) OneTypeOrdersInit( _MagicNumber );
И так должю быть по кругу

В процессе торгов в рынке могут быть только 3 комбинации ордеров с MagicNumber :

1. OrderType() ==OP_BUY и OrderType() ==OP_SELLSTOP
2. OrderType() == OP_SELL и OrderType() == OP_BUYSTOP
3. OrderType() ==OP_BUY и OrderType() == OP_SELL ------------------------- First=true

В процессе торгов в рынке могут быть только 3 комбинации ордеров с MagicNumber1 :

1. OrderType() ==OP_BUY и OrderType() ==OP_SELLSTOP
2. OrderType() == OP_SELL и OrderType() == OP_BUYSTOP
3. OrderType() ==OP_BUY и OrderType() == OP_SELL --------------------------------- Second=true

В процессе торгов в рынке могут быть только 3 комбинации ордеров с MagicNumber2 :

1. OrderType() ==OP_BUY и OrderType() ==OP_SELLSTOP
2. OrderType() == OP_SELL и OrderType() == OP_BUYSTOP
3. OrderType() ==OP_BUY и OrderType() == OP_SELL--------------------------------- Third=true

if (AccountEquity()+ NormalizeDouble(Profit*Point,Digits ) >= AccountBalance() )
{
CloseOrders();
First=false;
Second=false;
Third=false;
}


return(0);
}

Вопрос. Подскажите, как правильно расставить флаги, чтобы код работал без ошибок.

С уважением, Вячеслав.



avatar
14054
komposter 03.10.2006 10:20 
Вы не представляете, сколько времени и нервов забирает разбор чужого кода...
Тем более, без четкой постановки задачи.

Насколько я понимаю, вам надо что-то типа:
// находим ордера с MagicNumber
OneTypeOrdersInit( _MagicNumber );
// если есть хоть одна позиция (или ордер), что-то делаем
if ( _BuyTicket > 0 || _SellTicket > 0 || _BuyStopTicket > 0 || _SellStopTicket > 0 || _BuyLimitTicket > 0 || _SellLimitTicket > 0 )
{
 
 
}
 
// находим ордера с MagicNumber1
OneTypeOrdersInit( _MagicNumber1 );
// и опять, если есть хоть одна позиция (или ордер), что-то делаем
if ( _BuyTicket > 0 || _SellTicket > 0 || _BuyStopTicket > 0 || _SellStopTicket > 0 || _BuyLimitTicket > 0 || _SellLimitTicket > 0 )
{
 
 
}
 
// находим ордера с MagicNumber2
OneTypeOrdersInit( _MagicNumber2 );
if ( _BuyTicket > 0 || _SellTicket > 0 || _BuyStopTicket > 0 || _SellStopTicket > 0 || _BuyLimitTicket > 0 || _SellLimitTicket > 0 )
{
 
 
}



avatar
142
Vyacheslav 03.10.2006 13:29 
komposter писал (а):
Вы не представляете, сколько времени и нервов забирает разбор чужого кода...
Тем более, без четкой постановки задачи.

Насколько я понимаю, вам надо что-то типа:
// находим ордера с MagicNumber
OneTypeOrdersInit( _MagicNumber );
// если есть хоть одна позиция (или ордер), что-то делаем
if ( _BuyTicket > 0 || _SellTicket > 0 || _BuyStopTicket > 0 || _SellStopTicket > 0 || _BuyLimitTicket > 0 || _SellLimitTicket > 0 )
{
 
 
}
 
// находим ордера с MagicNumber1
OneTypeOrdersInit( _MagicNumber1 );
// и опять, если есть хоть одна позиция (или ордер), что-то делаем
if ( _BuyTicket > 0 || _SellTicket > 0 || _BuyStopTicket > 0 || _SellStopTicket > 0 || _BuyLimitTicket > 0 || _SellLimitTicket > 0 )
{
 
 
}
 
// находим ордера с MagicNumber2
OneTypeOrdersInit( _MagicNumber2 );
if ( _BuyTicket > 0 || _SellTicket > 0 || _BuyStopTicket > 0 || _SellStopTicket > 0 || _BuyLimitTicket > 0 || _SellLimitTicket > 0 )
{
 
 
}



Извините, на самом деле я все прекрасно представляю и понимаю, сам нахожусь в такой же "запарке".
Тему, которую я поднял на одном из форумов (с принципом работы можете познакомиться здесь, если найдете время http://forum.kimiv.ru/viewtopic.php?t=114), у меня уже была практически в завершенном виде, но все-таки чего-то и как-то не хватало по мелочи.
А тут я прочитал ваши статьи и понял, что гораздо эффективнее написать код по своей теме, используя ваши рекомендации.
Что касается неуклюже поставленной задачи то и здесь с вами согласен.
Мне фактически нужен "симафор" для управления несколькими группами ордеров с разными магическими номерами.
Я бы даже смог приспособить и код из темы "MagicNumber – "магический" идентификатор ордера" где автор рассматривает такой вариант когда надо, чтобы один и тот же эксперт торговал на графике одного торгового инструмента, например, на разных таймфреймах, но опять же чтобы этот процесс был управляемым. То есть работая на одном графике М1 по определенной ситуации вызывался бы и приступал к торговле код с магическим числом на графике М5 а затем М15 и вновь М1 и так далее по кругу.

Да, вы правильно все поняли.
Сначала работаем с ордерами первой группы OneTypeOrdersInit( _MagicNumber ), затем по установленному сигналу запускаем вторую группу ордеров OneTypeOrdersInit( _MagicNumber1), затем по установленному сигналу запускаем третью группу ордеров OneTypeOrdersInit( _MagicNumber2 );
А вот из третьей группы мы запускаем первую группу только в случае, если закрыты все ордера первой группы.

Вот собственно и все!

С уважением, Вячеслав.


avatar
14054
komposter 03.10.2006 15:43 
Так при чем здесь мейджик? ;)
Вам просто надо переменную-семафор.

Объявите вне функций что-то типа int semafor = 0; а потом меняйте его значение (когда надо включить 1-ю группу - semafor = 1;, когда 2-ю - semafor = 2;, и т.д.).

avatar
142
Vyacheslav 03.10.2006 15:58 
komposter писал (а):
Так при чем здесь мейджик? ;)
Вам просто надо переменную-семафор.

Объявите вне функций что-то типа int semafor = 0; а потом меняйте его значение (когда надо включить 1-ю группу - semafor = 1;, когда 2-ю - semafor = 2;, и т.д.).

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

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

С уважением, Вячеслав.


avatar
142
Vyacheslav 31.10.2006 13:22 
void OneTypeOrdersHist( int magic )
{
// обнуление переменных:
    hBuyTicket = 0; hSellTicket = 0; 
 
    hBuyLots = 0.0; hSellLots = 0.0; 
    
    hBuyOpenPrice = 0.0; hSellOpenPrice = 0.0; 
    
    hBuyStopLoss = 0.0; hSellStopLoss = 0.0; 
 
    hBuyTakeProfit = 0.0; hSellTakeProfit = 0.0;
 
    hBuyOpenTime = -1; hSellOpenTime = -1; 
 
    hBuyProfit = 0.0; hSellProfit = 0.0; 
    
    hBuyOrderCloseTime=-1; hSellOrderCloseTime=-1;
    
    hBuyOrderClosePrice=0.0; hSellOrderClosePrice=0.0;
    
    hBuySwap = 0.0; hSellSwap = 0.0;
    
    hBuyCommission = 0.0; hSellCommission = 0.0;
 
    hBuyComment = ""; hSellComment = ""; 
    
    int Error = 0, Total =  HistoryTotal();
    for ( int i = Total - 1; i >= 0; i -- )
    {
        if ( !OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) )
        {
            Error = GetLastError();
            Print( "OrderSelect( ", i, ", SELECT_BY_POS ) - Error #", Error );
            continue;
        }
        if ( OrderMagicNumber() == magic && OrderSymbol() == Symbol() )
        {
            switch ( OrderType() )
            {
                case OP_BUY:
                    hBuyTicket              = OrderTicket();
                    hBuyLots                  = NormalizeDouble( OrderLots(), 1 );
                    hBuyOpenPrice          = NormalizeDouble( OrderOpenPrice(), Digits );
                    hBuyStopLoss          = NormalizeDouble( OrderStopLoss(), Digits );
                    hBuyTakeProfit          = NormalizeDouble( OrderTakeProfit(), Digits );
                    hBuyOpenTime          = OrderOpenTime();
                    hBuyProfit              = NormalizeDouble( OrderProfit(), 2 );
                    hBuyOrderCloseTime  = OrderCloseTime() ;
                    hBuyOrderClosePrice = NormalizeDouble( OrderClosePrice() ,Digits );
                    hBuySwap                  = NormalizeDouble( OrderSwap(), 2 );
                    hBuyCommission          = NormalizeDouble( OrderCommission(), 2 );
                    hBuyComment              = OrderComment();
                    break;
                case OP_SELL:
                    hSellTicket               = OrderTicket();
                    hSellLots              = NormalizeDouble( OrderLots(), 1 );
                    hSellOpenPrice           = NormalizeDouble( OrderOpenPrice(), Digits );
                    hSellStopLoss           = NormalizeDouble( OrderStopLoss(), Digits );
                    hSellTakeProfit       = NormalizeDouble( OrderTakeProfit(), Digits );
                    hSellOpenTime           = OrderOpenTime();
                    hSellProfit               = NormalizeDouble( OrderProfit(), 2 );
                   hSellOrderCloseTime  = OrderCloseTime() ;
                    hSellOrderClosePrice = NormalizeDouble( OrderClosePrice() , Digits );
                    hSellSwap               = NormalizeDouble( OrderSwap(), 2 );
                    hSellCommission       = NormalizeDouble( OrderCommission(), 2 );
                    hSellComment           = OrderComment();
                    break;
            }
        }
    }
}
Уважаемый komposter!
Я хочу уточнить для себя, правильно ли я понимаю данный код.
Позволяет ли мне функция использовать только переменные последнего закрытого ордера или же двух последних закрытых ордеров по разным типам, и бай и сел ?

С уважением, Вячеслав.

avatar
14054
komposter 31.10.2006 13:33 
Да, всё должно работать.
К списку тем   | 1 2  

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий