- Зачем менять мейджик?
- Зачем изначально использовать 2 мейджика?
Более внимательно изучив код, я все-таки пришел к выводу, что
для моего случая пожалуй подойдет все-таки функция 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; } } } }
Если "таможня" дает добро, то прошу три "зеленых" свистка.
...
С уважением, Вячеслав.
Мне кажется, менять надо не функцию, а логику эксперта ;)
- Зачем менять мейджик?
- Зачем изначально использовать 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
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);
}
Вопрос. Подскажите, как правильно расставить флаги, чтобы код
работал без ошибок.
С уважением, Вячеслав.
Тем более, без четкой постановки задачи.
Насколько я понимаю, вам надо что-то типа:
// находим ордера с 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 ) { }
Вы не представляете, сколько времени и нервов забирает разбор чужого кода...
Тем более, без четкой постановки задачи.
Насколько я понимаю, вам надо что-то типа:
// находим ордера с 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 );
А вот из третьей группы мы запускаем первую группу только в
случае, если закрыты все ордера первой группы.
Вот собственно и все!
С уважением, Вячеслав.
Вам просто надо переменную-семафор.
Объявите вне функций что-то типа int semafor = 0; а потом меняйте его значение (когда надо включить 1-ю группу - semafor = 1;, когда 2-ю - semafor = 2;, и т.д.).
Так при чем здесь мейджик? ;)
Вам просто надо переменную-семафор.
Объявите вне функций что-то типа int semafor = 0; а потом меняйте его значение (когда надо включить 1-ю группу - semafor = 1;, когда 2-ю - semafor = 2;, и т.д.).
Дело в том, что сначала я пытался использовать одно магическое число и одна ваша функция, которое бы просто в нужный момент увеличивалось на одну единицу и получалось бы новое магическое число, а вместе с ним и вся группа ордеров. Но поскольку из этой затеи ничего не вышло, пока во всяком случае, то я пошел вторым путем на увеличение размера кода и увеличения количества функций.
Да, спасибо, я тоже потом уже сообразил, когда немного "остыл", что можно сделать все гораздо проще в данной ситуации, как вы и сказали.
С уважением, Вячеслав.
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!
Я хочу уточнить для себя, правильно ли я понимаю данный код.
Позволяет ли мне функция использовать только переменные последнего закрытого ордера или же двух последних закрытых ордеров по разным типам, и бай и сел ?
С уважением, Вячеслав.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Подскажите, как правильно использовать представленную ниже функцию при наличии следующих данных.
В системе используются ордера по двум магическим числам, предположим
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...
И так далее…
Вопрос. Что необходимо подправить в данной функции для наиболее рационального и правильного ее использования в стартовой функции в моем примере?Функция взята из темы статьи: «Управление ордерами – это просто»
'Управление ордерами – это просто'
автор mailto: komposterius[@]mail[.]ru.С уважением, Вячеслав.