extern string T5_1 = "Безубыток для Пирамиды";
extern bool WL = true; // Включение, отключение безубытка ордеров.
extern int WLstart = 30; // Откуда переводим (пункты профита)
extern int WLlevel = 1; // Куда переводим (пункты профита)
//---------------------------------------
extern string T5_2 = "Trailing для Пирамиды";
extern bool Trailing = true; // Вкл. треилинга
extern int TrailingStop = 30; // Размер трала в пунктах
extern int TrailingStep = 30; // Шаг трала в пунктах
//==========================================================
//+------------------------------------------------------------------+
//| global variables |
//+------------------------------------------------------------------+
double dPiramidTP = 0.0;
double dWLstart = 0.0;
double dWLlevel = 0.0;
double dTrailingStop = 0.0;
double dTrailingStep = 0.0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
//---- проверка введенных пользователем данных
if(WLlevel < 0) WLlevel = 0.0;
if(WLstart < 0) WLstart = 0.0;
if(TrailingStop < 0) TrailingStop = 0.0;
if(TrailingStep < 0) TrailingStep = 0.0;
//---конвертация данных
dWLstart = WLstart;
InfoChangeToDigit(_Symbol, dWLstart);
dWLlevel = WLlevel;
InfoChangeToDigit(_Symbol, dWLlevel);
dTrailingStop = TrailingStop;
InfoChangeToDigit(_Symbol, dTrailingStop);
dTrailingStep = TrailingStep;
InfoChangeToDigit(_Symbol, dTrailingStep);
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
// Трейлинг Стоп ордеров пирамиды
void PiramidTrailing(){
if(Trailing && TrailingStop > 0.0){
for(int i=OrdersTotal()-1;i>=0;i--){
if(OrderSelect(i,SELECT_BY_POS)){
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicPiramid){
switch(OrderType()){
case OP_BUY:
double _price = OrderStopLoss();
if(_price == 0.0 || _price < OrderOpenPrice()) _price = OrderOpenPrice();
//
if(Bid >= NormalizeDouble(_price+dTrailingStop,Digits)){
double _new_sl = NormalizeDouble(Bid-dTrailingStep,Digits);
if(NormalizeDouble(OrderStopLoss()-_new_sl,Digits)!=0.0 && _new_sl > _price){
OrderModify(OrderTicket(),OrderOpenPrice(),_new_sl,OrderTakeProfit(),OrderExpiration());
}
}
break;
case OP_SELL:
_price = OrderStopLoss();
if(_price == 0.0 || _price > OrderOpenPrice()) _price = OrderOpenPrice();
//
if(Ask <= NormalizeDouble(_price-dTrailingStop,Digits)){
_new_sl = NormalizeDouble(Ask+dTrailingStep,Digits);
if(NormalizeDouble(OrderStopLoss()-_new_sl,Digits)!=0.0 && _new_sl < _price){
OrderModify(OrderTicket(),OrderOpenPrice(),_new_sl,OrderTakeProfit(),OrderExpiration());
}
}
break;
}
}
}
}
}
}
//+------------------------------------------------------------------+
// Установка безубытка для ордеров пирамиды
void PiramidBE(){
if(WL && WLstart > 0){
for(int i=OrdersTotal()-1;i>=0;i--){
if(OrderSelect(i,SELECT_BY_POS)){
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicPiramid){
switch(OrderType()){
case OP_BUY:
if(OrderStopLoss()==0.0 || OrderStopLoss() < NormalizeDouble(OrderOpenPrice()+dWLlevel,Digits)){
if(Bid >= NormalizeDouble(OrderOpenPrice()+dWLstart,Digits)){
double _new_sl = NormalizeDouble(OrderOpenPrice()+dWLlevel,Digits);
if(NormalizeDouble(OrderStopLoss()-_new_sl,Digits)!=0.0){
OrderModify(OrderTicket(),OrderOpenPrice(),_new_sl,OrderTakeProfit(),OrderExpiration());
}
}
}
break;
case OP_SELL:
if(OrderStopLoss()==0.0 || OrderStopLoss() > NormalizeDouble(OrderOpenPrice()-dWLlevel,Digits)){
if(Ask <= NormalizeDouble(OrderOpenPrice()-dWLstart,Digits)){
_new_sl = NormalizeDouble(OrderOpenPrice()-dWLlevel,Digits);
if(NormalizeDouble(OrderStopLoss()-_new_sl,Digits)!=0.0){
OrderModify(OrderTicket(),OrderOpenPrice(),_new_sl,OrderTakeProfit(),OrderExpiration());
}
}
}
break;
}
}
}
}
}
}
extern int BU_Start = 2; // С какова ордера ничинать выставлять без убыток
extern int Trailing_Start= 2; // С какова ордера ничинать тралить стоп лос без убытка.
for(int i=OrdersTotal()-1;i>=0;i--){
for(int i=OrdersTotal()-1;i>=BU_Start;i--){
Сначала надо разобраться какой ордер первый, а какой второй.Вообщем имею в советнике вот такой код
Код:extern string T5_1 = "Безубыток для Пирамиды"; extern bool WL = true; // Включение, отключение безубытка ордеров. extern int WLstart = 30; // Откуда переводим (пункты профита) extern int WLlevel = 1; // Куда переводим (пункты профита) //--------------------------------------- extern string T5_2 = "Trailing для Пирамиды"; extern bool Trailing = true; // Вкл. треилинга extern int TrailingStop = 30; // Размер трала в пунктах extern int TrailingStep = 30; // Шаг трала в пунктах //========================================================== //+------------------------------------------------------------------+ //| global variables | //+------------------------------------------------------------------+ double dPiramidTP = 0.0; double dWLstart = 0.0; double dWLlevel = 0.0; double dTrailingStop = 0.0; double dTrailingStep = 0.0; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ //---- проверка введенных пользователем данных if(WLlevel < 0) WLlevel = 0.0; if(WLstart < 0) WLstart = 0.0; if(TrailingStop < 0) TrailingStop = 0.0; if(TrailingStep < 0) TrailingStep = 0.0; //---конвертация данных dWLstart = WLstart; InfoChangeToDigit(_Symbol, dWLstart); dWLlevel = WLlevel; InfoChangeToDigit(_Symbol, dWLlevel); dTrailingStop = TrailingStop; InfoChangeToDigit(_Symbol, dTrailingStop); dTrailingStep = TrailingStep; InfoChangeToDigit(_Symbol, dTrailingStep); //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ // Трейлинг Стоп ордеров пирамиды void PiramidTrailing(){ if(Trailing && TrailingStop > 0.0){ for(int i=OrdersTotal()-1;i>=0;i--){ if(OrderSelect(i,SELECT_BY_POS)){ if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicPiramid){ switch(OrderType()){ case OP_BUY: double _price = OrderStopLoss(); if(_price == 0.0 || _price < OrderOpenPrice()) _price = OrderOpenPrice(); // if(Bid >= NormalizeDouble(_price+dTrailingStop,Digits)){ double _new_sl = NormalizeDouble(Bid-dTrailingStep,Digits); if(NormalizeDouble(OrderStopLoss()-_new_sl,Digits)!=0.0 && _new_sl > _price){ OrderModify(OrderTicket(),OrderOpenPrice(),_new_sl,OrderTakeProfit(),OrderExpiration()); } } break; case OP_SELL: _price = OrderStopLoss(); if(_price == 0.0 || _price > OrderOpenPrice()) _price = OrderOpenPrice(); // if(Ask <= NormalizeDouble(_price-dTrailingStop,Digits)){ _new_sl = NormalizeDouble(Ask+dTrailingStep,Digits); if(NormalizeDouble(OrderStopLoss()-_new_sl,Digits)!=0.0 && _new_sl < _price){ OrderModify(OrderTicket(),OrderOpenPrice(),_new_sl,OrderTakeProfit(),OrderExpiration()); } } break; } } } } } } //+------------------------------------------------------------------+ // Установка безубытка для ордеров пирамиды void PiramidBE(){ if(WL && WLstart > 0){ for(int i=OrdersTotal()-1;i>=0;i--){ if(OrderSelect(i,SELECT_BY_POS)){ if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicPiramid){ switch(OrderType()){ case OP_BUY: if(OrderStopLoss()==0.0 || OrderStopLoss() < NormalizeDouble(OrderOpenPrice()+dWLlevel,Digits)){ if(Bid >= NormalizeDouble(OrderOpenPrice()+dWLstart,Digits)){ double _new_sl = NormalizeDouble(OrderOpenPrice()+dWLlevel,Digits); if(NormalizeDouble(OrderStopLoss()-_new_sl,Digits)!=0.0){ OrderModify(OrderTicket(),OrderOpenPrice(),_new_sl,OrderTakeProfit(),OrderExpiration()); } } } break; case OP_SELL: if(OrderStopLoss()==0.0 || OrderStopLoss() > NormalizeDouble(OrderOpenPrice()-dWLlevel,Digits)){ if(Ask <= NormalizeDouble(OrderOpenPrice()-dWLstart,Digits)){ _new_sl = NormalizeDouble(OrderOpenPrice()-dWLlevel,Digits); if(NormalizeDouble(OrderStopLoss()-_new_sl,Digits)!=0.0){ OrderModify(OrderTicket(),OrderOpenPrice(),_new_sl,OrderTakeProfit(),OrderExpiration()); } } } break; } } } } } }
Мне нужно добавить в блок без убытка еще один параметр
А так же в блок трейлинга этого без убыткаКод:extern int BU_Start = 2; // С какова ордера ничинать выставлять без убыток
Пробовал изменять строкуКод:extern int Trailing_Start= 2; // С какова ордера ничинать тралить стоп лос без убытка.
вот таким образомКод:for(int i=OrdersTotal()-1;i>=0;i--){
так же и в трале, но данная работа проходит не коректно и срабатывает по чему то через разКод:for(int i=OrdersTotal()-1;i>=BU_Start;i--){
если сделать i>=2; то без убыток начинает отрабатывать со второго ордера, но если вместо 2 вставлен BU_Start в тестере работает нормально с визуалом, а в онлан режиме переодически и очнь часто глюки появляются, в основном в упор не хочет видеть что ему там выставляешь и шпарит как обычно с первого ордера.
Буду очень признателен если поможете в реализации с пояснениями, я вроде бы как пока начинающий программист и все пояснения были бы мне к стати
Спасибо.
Сначала надо разобраться какой ордер первый, а какой второй.
В списке OrdersTotal() ордера как-то отсортированы, но как никто толком не знает. Поэтому каждый по своему определяет первый и последний ордер как в рынке так и в истории.
На днях была дискуссия по сортировке ордеров истории на форуме mql4 и Ренат сказал, что не помнит как сделано и надо смотреть код, а потом так и не ответил. Видимо забыл.
Так-что вот определи первый ордер и при переборе в цикле встретив его тикет команда continue;
Я то же так думал сначала, пока не проверил с перезапуском терминала.В МТ4 по умолчанию, без сортировок, рыночные ордера упорядочены по времени открытия, а история, кажется, по времени закрытия ордера.
Всегда надо сортировать в ситуациях когда имеет значение порядок. Тогда гарантировано будет известно в каком порядке ордера.Но на этом можно не заморачиваться, если отписать процедуру(ы) сортировки по нужному параметру ордера.
Вот с этого поста начался диалог о котором я говорил. _http://forum.mql4.com/ru/60554/page98#925738В МТ4 по умолчанию, без сортировок, рыночные ордера упорядочены по времени открытия, а история, кажется, по времени закрытия ордера.
Но на этом можно не заморачиваться, если отписать процедуру(ы) сортировки по нужному параметру ордера.
Я то же так думал сначала, пока не проверил с перезапуском терминала.
Всегда надо сортировать в ситуациях когда имеет значение порядок. Тогда гарантировано будет известно в каком порядке ордера.
Кстати, нигде не прописано в справочнике в каком порядке сортированы ордера, значит вполне могут, с выходом очередного билда изменить порядок.
Если использовать сортировку по нужному параметру, программа останется рабочей.
Вот с этого поста начался диалог о котором я говорил. _http://forum.mql4.com/ru/60554/page98#925738
Можешь напомнить Ренату о его обещании.
Я именно про программный доступ к ордерам.Яж не в интерфейсе терминала смотрю, я выводы по OrderSelect(i,...); делаю, по индексу.
void OnTick()
{
{
if (Hour() == 1 && Open[1] > Close[1])
if (Hour() == 2 && (Open[1] <= Close[1] || Open[1] >= Close[1]))
if (Hour() == 3 && Open[1] > Close[1])
OrderSend(Symbol(), OP_SELL, lots, Bid, Slippage, slforsell, 0, "Надеюсь прыбль", MagicNumber, 0, clrNONE);
}
{
if (Hour() == 1 && Open[1] < Close[1])
if (Hour() == 2 && (Open[1] <= Close[1] || Open[1] >= Close[1]))
if (Hour() == 3 && Open[1] < Close[1])
OrderSend(Symbol(), OP_BUY, lots, Ask, Slippage, slforbuy, 0, "Надеюсь прыбль", MagicNumber, 0, clrNONE);
}
}
//+------------------------------------------------------------------+
Я именно про программный доступ к ордерам.
Так вот, проверено на старом билде.
Ордера из списка MODE_TRADES располагаются по мере открытия в порядке по времени открытия, после перезапуска терминала в порядке тикетов.
Ордера из списка MODE_HISTORY располагаются по мере закрытия в порядке по времени закрытия, после перезапуска терминала в порядке тикетов.
Как в новом билде не знаю, не проверял. Возможно этот дурдом остался, а могли и поменять.
Может я и не прав, пока учусь, но, результат должен быть на "первой секунде", тике четвертого часа, тогда для третьего часа будет первый бар, для второго часа - второй бар (не понятно зачем его определять, когда её значение не имеет разницы, что свеча бычья или медвежья), для первого часа - третий бар.
а что я делю неправильно ? в тестере такую ошибку выдает что делать ?