| / | Форум |
|
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_SELLSTOP2. 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 позволяет хранить всю рабочую информацию в одном месте: письма, документы, файлы, платежи и история сообщений в чате. Так решается проблема сохранности данных и удобной групповой работы с ними. |
|
komposter
29.09.2006 14:35
Мне кажется, менять надо не функцию, а логику эксперта ;)
- Зачем менять мейджик? - Зачем изначально использовать 2 мейджика? |
|
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; } } } } Если "таможня" дает добро, то прошу три "зеленых" свистка.
... |
|
Vyacheslav
29.09.2006 17:25
komposter писал (а): Мне кажется, менять надо не функцию, а логику эксперта ;) - Зачем менять мейджик? - Зачем изначально использовать 2 мейджика? Вы знаете, вы правы! Спасибо. С уважением, Вячеслав. |
|
Vyacheslav
02.10.2006 16:06
Vyacheslav писал (а): Просьба к komposter !komposter писал (а): Мне кажется, менять надо не функцию, а логику эксперта ;) - Зачем менять мейджик? - Зачем изначально использовать 2 мейджика? Вы знаете, вы правы! Спасибо. С уважением, Вячеслав. Подскажите еще такой вариант. Предположим у меня три ваши функции и каждая из них со своим магическим числом #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_SELLSTOP2. OrderType() == OP_SELL и OrderType() == OP_BUYSTOP 3. OrderType() ==OP_BUY и OrderType() == OP_SELL ------------------------- First=true В процессе торгов в рынке могут быть только 3 комбинации ордеров с MagicNumber1 : 1. OrderType() ==OP_BUY и OrderType() ==OP_SELLSTOP В процессе торгов в рынке могут быть только 3 комбинации ордеров с MagicNumber2 : 1. OrderType() ==OP_BUY и OrderType() ==OP_SELLSTOP |
|
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 ) { } |
|
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 ) { } Извините, на самом деле я все прекрасно представляю и понимаю,
сам нахожусь в такой же "запарке". |
|
komposter
03.10.2006 15:43
Так при чем здесь мейджик? ;)
Вам просто надо переменную-семафор. Объявите вне функций что-то типа int semafor = 0; а потом меняйте его значение (когда надо включить 1-ю группу - semafor = 1;, когда 2-ю - semafor = 2;, и т.д.). |
|
Vyacheslav
03.10.2006 15:58
komposter писал (а): Так при чем здесь мейджик? ;) Вам просто надо переменную-семафор. Объявите вне функций что-то типа int semafor = 0; а потом меняйте его значение (когда надо включить 1-ю группу - semafor = 1;, когда 2-ю - semafor = 2;, и т.д.). Дело в том, что сначала я пытался использовать одно магическое число и одна ваша функция, которое бы просто в нужный момент увеличивалось на одну единицу и получалось бы новое магическое число, а вместе с ним и вся группа ордеров. Но поскольку из этой затеи ничего не вышло, пока во всяком случае, то я пошел вторым путем на увеличение размера кода и увеличения количества функций. Да, спасибо, я тоже потом уже сообразил, когда немного "остыл", что можно сделать все гораздо проще в данной ситуации, как вы и сказали. С уважением, Вячеслав. |
|
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! Я хочу уточнить для себя, правильно ли я понимаю данный код. Позволяет ли мне функция использовать только переменные последнего закрытого ордера или же двух последних закрытых ордеров по разным типам, и бай и сел ? С уважением, Вячеслав. |
|
komposter
31.10.2006 13:33
Да, всё должно работать.
|
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий