Ответить
16.05.2018, 15:41
Аватар для vladradon
vladradon vladradon на форуме Местный житель
Регистрация: 12.02.2015 / Сообщений: 563
Поблагодарили 281 раз(а) / Репутация: 288
особенно непонятно
PHP код:
_Symbol
можете пояснить что это за переменная и почему перед ней знак подчеркивания?
В этой переменной хранится имя символа текущего графика - аналог Symbol(). А подчеркивание - это фенька из 5-го языка и если в старых билдах не работает, то замени на аналог.
еще вопрос - если мне не важно(в данном случае) какой символ и какой тип ордера, важен только магик и количество открытых позиций по каждому магику, то мне кажется строка должна иметь вид
PHP код:
if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES)
Не совсем: нужно еще учитывать тип открытых и выставленных ордеров и если при подсчете не нужно учитывать отложки, то вводим проверку типа ордера (0 - бай и 1 - селл, а 2-5 уже отложки) -
PHP код:
if(OrderSelect(i,SELECT_BY_POSMODE_TRADES) && OrderType()<2
и количество скобок должно быть четным (у тебя не хватает скобки в конце этой строки)!
Можно вечно смотреть на то, как горит огонь, как течет вода... и как работает трал...

Последний раз редактировалось vladradon; 16.05.2018 в 15:46.
Milord 
16.05.2018, 16:10
Аватар для AlexeyVik
AlexeyVik AlexeyVik на форуме Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,788
Поблагодарили 3,909 раз(а) / Репутация: 3898
В этой переменной хранится имя символа текущего графика - аналог Symbol(). А подчеркивание - это фенька из 5-го языка и если в старых билдах не работает, то замени на аналог.

Не совсем: нужно еще учитывать тип открытых и выставленных ордеров и если при подсчете не нужно учитывать отложки, то вводим проверку типа ордера (0 - бай и 1 - селл, а 2-5 уже отложки) -
PHP код:
if(OrderSelect(i,SELECT_BY_POSMODE_TRADES) && OrderType()<2
и количество скобок должно быть четным (у тебя не хватает скобки в конце этой строки)!
Имелось ввиду не правильное расположение одной из скобок
if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES && OrderSymbol()==_Symbol) && OrderType()<=1)
потому и осталось непарное количество скобок.
Если этот код был написан не "на коленке", то странно что компилятор это пропустил.
16.05.2018, 16:17
Аватар для vladradon
vladradon vladradon на форуме Местный житель
Регистрация: 12.02.2015 / Сообщений: 563
Поблагодарили 281 раз(а) / Репутация: 288
Если этот код был написан не "на коленке", то странно что компилятор это пропустил.
Я код писал не в редакторе, а здесь в сообщении и поспешил не проверив. Кстати, закинул сейчас в редактор - компилирует без проблем, при чем в режиме strict. Проверил на графике с ордерами другого сова - тоже работает!!! Сам в шоке...
Только проверка на символ не работает...
Можно вечно смотреть на то, как горит огонь, как течет вода... и как работает трал...

Последний раз редактировалось vladradon; 16.05.2018 в 16:45.
16.05.2018, 18:21
Аватар для Milord
Milord Milord на форуме Местный знаток
Регистрация: 26.03.2011 / Сообщений: 635
Поблагодарили 711 раз(а) / Репутация: 714
Не совсем: нужно еще учитывать тип открытых и выставленных ордеров и если при подсчете не нужно учитывать отложки, то вводим проверку типа ордера (0 - бай и 1 - селл, а 2-5 уже отложки) -
PHP код:
if(OrderSelect(i,SELECT_BY_POSMODE_TRADES) && OrderType()<2
и количество скобок должно быть четным (у тебя не хватает скобки в конце этой строки)!
спасибо за скобку, снова не нарисовал одну, бывает не сразу вижу ошибку, но компилятор не компилирует с ошибками, так что скобки в итоге "находятся" лишние или недостающие!)))
на счет того, что нужно проверять какой тип ордера, снова неясно - зачем? если в моей(данной) ТС как раз это не важно!
тестю советники, иногда пишу и дорабатываю их ...
ПУТЬ ДЛИННОЙ В 10000 МИЛЬ НАЧИНАЕТСЯ С 1 ШАГА (Лао Цзы)

Последний раз редактировалось Milord; 16.05.2018 в 18:27.
16.05.2018, 19:05
Аватар для vladradon
vladradon vladradon на форуме Местный житель
Регистрация: 12.02.2015 / Сообщений: 563
Поблагодарили 281 раз(а) / Репутация: 288
на счет того, что нужно проверять какой тип ордера, снова неясно - зачем? если в моей(данной) ТС как раз это не важно!
На промежуточном этапе написания кода это может и не важно. Главное, чтобы в будущем из-за отсутствия этой проверки не возникло сбоев, особенно если на одном символе будет вестись торговля совом и скриптом, выставляющим отложки и т.п. Задача была подсчитать рыночные ордера, поэтому проверка на тип.
Можно вечно смотреть на то, как горит огонь, как течет вода... и как работает трал...
17.05.2018, 06:41
Аватар для AlexeyVik
AlexeyVik AlexeyVik на форуме Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,788
Поблагодарили 3,909 раз(а) / Репутация: 3898
Я код писал не в редакторе, а здесь в сообщении и поспешил не проверив. Кстати, закинул сейчас в редактор - компилирует без проблем, при чем в режиме strict. Проверил на графике с ордерами другого сова - тоже работает!!! Сам в шоке...
Только проверка на символ не работает...
Это и называется "писать "на коленке".
Дальше у меня только эмоции... как может компилироваться??? Странно...
Видимо это остатки необязательности языка, которых совсем недавно, было немереное количество.
17.05.2018, 10:29
Аватар для Anna89
Anna89 Anna89 вне форума Интересующийся
Регистрация: 02.10.2015 / Сообщений: 21
Поблагодарили 0 раз(а) / Репутация: 1
Подскажите, пожалуйста. Как правильно описать перекрещение двух линий? И сразу выставлялась линия на определенное расстояние ( после пересечение ценой этой линии ставилась сделка)?
У меня ставится много линий, а надо одно пересечение одна линия.
Кусок кода. Пример на покупку.

Код:
MagDO=iCustom(Symbol(),0,"__MAcanals2",MA_Period,MA_Shift,MA_Method,Channel1,Channel2,Channel3,1,0);
   MagUP=iCustom(Symbol(),0,"__MAcanals2",MA_Period,MA_Shift,MA_Method,Channel1,Channel2,Channel3,2,0);

   BlDO=iCustom(Symbol(),0,"superprkanal",dll_period,Rc_fast,Rc_slow,Rc_slope_trend,SL_distance_pips,DisplayAlert,
                ShowCurrentCandle,Rast,2,0);
   YelUP=iCustom(Symbol(),0,"superprkanal",dll_period,Rc_fast,Rc_slow,Rc_slope_trend,SL_distance_pips,DisplayAlert,
                 ShowCurrentCandle,Rast,3,0);

   for(i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
        {
         if(OrderMagicNumber()==Magic || OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY) pos++;
            if(OrderType()==OP_SELL) pos++;
           }
        }
     }

         if(MagUP<=YelUP)
           {
            ObjectCreate("BS"+TimeToStr(Time[i],TIME_DATE|TIME_MINUTES),OBJ_HLINE,0,0,High[0]+Punkt*Point);
            LinePrice1=ObjectGet("BS"+TimeToStr(Time[i],TIME_DATE|TIME_MINUTES),OBJPROP_PRICE1);
            ObjectSet("BS"+TimeToStr(Time[i],TIME_DATE|TIME_MINUTES),OBJPROP_COLOR,Blue);
            ObjectSet("BS"+TimeToStr(Time[i],TIME_DATE|TIME_MINUTES),OBJPROP_STYLE,STYLE_SOLID);
            ObjectSet("BS"+TimeToStr(Time[i],TIME_DATE|TIME_MINUTES),OBJPROP_WIDTH,1);
            ObjectSet("BS"+TimeToStr(Time[i],TIME_DATE|TIME_MINUTES),OBJPROP_RAY,false);
17.05.2018, 12:38
Аватар для vladradon
vladradon vladradon на форуме Местный житель
Регистрация: 12.02.2015 / Сообщений: 563
Поблагодарили 281 раз(а) / Репутация: 288
Rep Report
Подскажите, пожалуйста. Как правильно описать перекрещение двух линий? И сразу выставлялась линия на определенное расстояние ( после пересечение ценой этой линии ставилась сделка)?
У меня ставится много линий, а надо одно пересечение одна линия.
Привет! Приведу пример для 2-х переменных (данных индикаторов). Всю стратегию не знаю, поэтому что-то нужно будет подправить (смещение красной линии, наверное, нужно вычитать и т.п.). Сам вход не делал - там все просто - сравнение текущего Bid (Ask) с LinePrice1 (LinePrice2), затем сам вход по OrderSend и (если нужно) удаление пересеченной линии функцией ObjectsDelete, и обнуление триггерной переменной MagUPYelUP, которая фиксирует направление последнего пересечения. Если появилось новое пересечение, то старая линия удаляется. Я ввел 2 базовых имени для линий BS1 и BS2 - их можно везде поменять, конечно. Это просто заготовка для корректного встраивания в код. Продублированные переменные в конце кода нужно удалить.
PHP код:
if(MagUPYelUP==&& MagUP<YelUPMagUPYelUP=1;
 if(
MagUPYelUP==&& MagUP>YelUPMagUPYelUP=2;
 if(
MagUP<=YelUP && MagUPYelUP==&& ObjectFind(0,"BS1"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES))<0)
   {
    
ObjectsDelete("BS1");
    
ObjectCreate("BS1"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJ_HLINE,0,0,High[0]+Punkt*Point);
    
LinePrice1=ObjectGet("BS1"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJPROP_PRICE1);
    
ObjectSet("BS1"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJPROP_COLOR,clrBlue);
    
ObjectSet("BS1"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJPROP_STYLE,STYLE_SOLID);
    
ObjectSet("BS1"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJPROP_WIDTH,1);
    
ObjectSet("BS1"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJPROP_RAY,false);
    
MagUPYelUP=1;
   }
 if(
MagUP>=YelUP && MagUPYelUP==&& ObjectFind(0,"BS2"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES))<0)
   {
    
ObjectsDelete("BS2");
    
ObjectCreate("BS2"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJ_HLINE,0,0,High[0]+Punkt*Point);
    
LinePrice2=ObjectGet("BS2"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJPROP_PRICE1);
    
ObjectSet("BS2"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJPROP_COLOR,clrRed);
    
ObjectSet("BS2"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJPROP_STYLE,STYLE_SOLID);
    
ObjectSet("BS2"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJPROP_WIDTH,1);
    
ObjectSet("BS2"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJPROP_RAY,false);
    
MagUPYelUP=2;
   }

//------ 
  
}//Конец функции OnTick

void ObjectsDelete(string name="")
  {
   for(
int i=ObjectsTotal()-1i>=0i--)
      if(
StringFind(ObjectName(i),name,0)>=0ObjectDelete(ObjectName(i));
  }

double LinePrice1=0,LinePrice2=0,MagUP=0,YelUP=0,Punkt=0;
int pos=0;
int MagUPYelUP=0
Цикл в предоставленном коде не знаю зачем нужен. К тому же он либо с ошибкой, либо специально выключен. Я его не использовал. Строки со считыванием данных индикаторов я не вписывал, т.к. у меня нет этих индюков, но они так и остаются перед моим кодом, естественно.
Можно вечно смотреть на то, как горит огонь, как течет вода... и как работает трал...

Последний раз редактировалось vladradon; 17.05.2018 в 12:42.
17.05.2018, 12:58
Аватар для Anna89
Anna89 Anna89 вне форума Интересующийся
Регистрация: 02.10.2015 / Сообщений: 21
Поблагодарили 0 раз(а) / Репутация: 1
Спасибо большое.
17.05.2018, 13:19
Аватар для vladradon
vladradon vladradon на форуме Местный житель
Регистрация: 12.02.2015 / Сообщений: 563
Поблагодарили 281 раз(а) / Репутация: 288
Спасибо большое.
Забыл добавить: переменные LinePrice1 и LinePrice2 после открытия соответствующих ордеров следует обнулять и перед каждым открытием и проверкой на пересечение проверять их значения и только если они не нулевые разрешать открытие по пересечению. Получится следующее: если переменная равна 0, то либо нет линии, либо по этой линии уже выставлен ордер и не будет выставляться куча ордеров по одному пересечению. А ненулевое значение переменная получает только при выставлении новой линии.
Можно вечно смотреть на то, как горит огонь, как течет вода... и как работает трал...
17.05.2018, 14:43
Аватар для vladradon
vladradon vladradon на форуме Местный житель
Регистрация: 12.02.2015 / Сообщений: 563
Поблагодарили 281 раз(а) / Репутация: 288
У меня ставится много линий, а надо одно пересечение одна линия.
Еще одно замечание: если сов будет параллельно работать на нескольких парах, то в имена линий нужно добавить имена символов типа "BS1"+_Symbol+... и функцию удаления объектов запускать ObjectsDelete("BS2"+_Symbol); , чтобы однотипные линии на соседних графиках не удалялись.
Можно вечно смотреть на то, как горит огонь, как течет вода... и как работает трал...
21.05.2018, 23:52
Аватар для Milord
Milord Milord на форуме Местный знаток
Регистрация: 26.03.2011 / Сообщений: 635
Поблагодарили 711 раз(а) / Репутация: 714
На промежуточном этапе написания кода это может и не важно. Главное, чтобы в будущем из-за отсутствия этой проверки не возникло сбоев, особенно если на одном символе будет вестись торговля совом и скриптом, выставляющим отложки и т.п. Задача была подсчитать рыночные ордера, поэтому проверка на тип.
ну это да, согласен если два пашут на счете и сова и скрипт..кстати тут вопросик у меня новый возник, может чего подскажите, суть такая, нужно в коде прописать запрет открывать ордера, если на счете уже открыты рыночные ордера с Magic2 от второго советника,кусок кода ниже для ясности,куда нужно втиснуть запрет на торговлю, если на счете будут открыты ордера с магиком2:

PHP код:
extern int       Magic1=123;
 
extern int       MaxOrdersMagic1=1;
--------------------------------------------- 
int start() 

//------------------------------- 
double OrdersMagic1=0;
for(
int i=0;i<OrdersTotal();i++)
 if(
OrderSelect(i,SELECT_BY_POSMODE_TRADES))
 {
  if(
OrderMagicNumber()==Magic1OrdersMagic1++;
 }
//------
if(OrdersMagic1<MaxOrdersMagic1)
 {  
  if(
A>B
   { 
   
OrderSend(Symbol(),OP_BUY,...,Magic1,...); 
   }
//-------
 
if(A<B
   { 
   
OrderSend(Symbol(),OP_SELL,...,Magic1,...); 
   } 
 } 
тестю советники, иногда пишу и дорабатываю их ...
ПУТЬ ДЛИННОЙ В 10000 МИЛЬ НАЧИНАЕТСЯ С 1 ШАГА (Лао Цзы)

Последний раз редактировалось Milord; 22.05.2018 в 00:00.
22.05.2018, 03:45
Аватар для vladradon
vladradon vladradon на форуме Местный житель
Регистрация: 12.02.2015 / Сообщений: 563
Поблагодарили 281 раз(а) / Репутация: 288
нужно в коде прописать запрет открывать ордера, если на счете уже открыты рыночные ордера с Magic2 от второго советника
Такие легкости уже сам должен писать :
PHP код:
extern int       Magic1=123;
 
extern int       Magic2=234;
 
extern int       MaxOrdersMagic1=1;
--------------------------------------------- 
int start() 

//------------------------------- 
double OrdersMagic1=0;
double OrdersMagic2=0;
for(
int i=0;i<OrdersTotal();i++)
 if(
OrderSelect(i,SELECT_BY_POSMODE_TRADES))
 {
  if(
OrderMagicNumber()==Magic1OrdersMagic1++;
  if(
OrderType()<&& OrderMagicNumber()==Magic2OrdersMagic2++;
 }
//------
if(OrdersMagic1<MaxOrdersMagic1 && OrdersMagic2<1)
 {  
  if(
A>B
   { 
   
OrderSend(Symbol(),OP_BUY,...,Magic1,...); 
   }
//-------
 
if(A<B
   { 
   
OrderSend(Symbol(),OP_SELL,...,Magic1,...); 
   } 
 } 
Опять учет только рыночных ордеров, поэтому вписал проверку OrderType()<2 и если она не нужна, то удали.
Можно вечно смотреть на то, как горит огонь, как течет вода... и как работает трал...
Milord 
22.05.2018, 16:25
Аватар для Milord
Milord Milord на форуме Местный знаток
Регистрация: 26.03.2011 / Сообщений: 635
Поблагодарили 711 раз(а) / Репутация: 714
Такие легкости уже сам должен писать :
PHP код:
if(OrdersMagic1<MaxOrdersMagic1 && OrdersMagic2<1)
 {  
  if(
A>B
   { 
   
OrderSend(Symbol(),OP_BUY,...,Magic1,...); 
   }
 } 
вот в чем и дело, что самое трудное прописать в коде самые простые вещи!
спасибо вам за помощь,может глянете свежим взглядом на код трала,какие в нем есть ошибки и как в нем прописать дополнительно TrailingStart и TrailingStep,так как сам потерял малость форму в кодировании, половину позабыл что знал из-за большого перерыва,остальную половину по сей день осваиваю..

PHP код:
for(int i=0i<OrdersTotal(); i++) 
     {
      if(
OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      if(
OrderSymbol()==Symbol()||OrderMagicNumber()==Magic)
       if(
OrderType()==OP_BUY)
         {
          if(
TrailingStop>0)  
            {                 
              if(
Bid-OrderOpenPrice()>TrailingStop*Point)
               {
                 if(
OrderStopLoss()<Bid-TrailingStop*Point)
                  {
                     
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Point,OrderTakeProfit(),0,Green);
                  }
               }
            }
         }
         
        if(
OrderType()==OP_SELL)
         {
           if(
TrailingStop>0)  
            {                 
              if((
OrderOpenPrice()-Ask)>TrailingStop*Point)
               {
                 if((
OrderStopLoss()>(Ask+TrailingStop*Point)) || (OrderStopLoss()==0))
                  {
                     
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point,OrderTakeProfit(),0,Red);
                  }
               }
            }
         }   
   } 
тестю советники, иногда пишу и дорабатываю их ...
ПУТЬ ДЛИННОЙ В 10000 МИЛЬ НАЧИНАЕТСЯ С 1 ШАГА (Лао Цзы)
23.05.2018, 09:07
Аватар для MrGreen86
MrGreen86 MrGreen86 на форуме Элитный участник
Регистрация: 12.01.2012 / Сообщений: 857
Поблагодарили 1,155 раз(а) / Репутация: 1155
может глянете свежим взглядом на код трала,какие в нем есть ошибки и как в нем прописать дополнительно TrailingStart и TrailingStep
Ошибки:
1) перебор ордеров следует делать с конца. В случае если на счете работает 2+ советника и второй советник в момент перебора закроет один из ордеров в списке - у вас может случится пропуск ордера
2) у вас ордер проверяется или по инструменту, или по меджику что не корректно. нужно не ИЛИ а И. так как он заденет ордера другого советника на том же инструменте и другого советника с тем же меджиком.
3) if(TrailingStop>0) это лучше ставить в самое начало, нет смысла проверять ордера если трала вообще нет.
4) отстусвует зазор при модификации стоп лоса. По вашим условиям стоп лосс может ползти каждый 1 тик. Многие брокеру ругаются на это на 5 знаке. рекомендую ставить зазор в 10 тиков для 5 знака. что как бы соответствует 1 пункту.
5) отсутсвует округление расчеткой цены в функции модификации ордера, не все брокеры такое пропустят.
6) отсутсвует проверка исполнения. Если ошибка серьезная он будет долбить брокера приказами пока не получит бан.

Вот правильныq вариант сразу со степом и стартом

PHP код:
if(TrailingStop>0) {
   for(
int i=OrdersTotal()-1i>=0i--) {
      if(!
OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(
OrderSymbol()!=Symbol()) continue;
      if(
OrderMagicNumber()!=Magic) continue;
      if(
OrderType()==OP_BUY && Bid-OrderOpenPrice() >= TrailingStart*Point) {
         if(
OrderStopLoss() <= Bid-(TrailingStop+TrailingStep)*Point) {
            if(!
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-TrailingStop*Point,Digits),OrderTakeProfit(),0,Green)) {
               
// тут надо проверить ошибку
            
}
         }
      }
      if(
OrderType()==OP_SELL && OrderOpenPrice()-Ask >= TrailingStart*Point) {
         if(
OrderStopLoss() >= Ask+(TrailingStop+TrailingStep)*Point || OrderStopLoss()==0) {
            if(!
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+TrailingStop*Point,Digits),OrderTakeProfit(),0,Green)) {
               
// тут надо проверить ошибку
            
}
         }
      }
   }

23.05.2018, 10:13
Аватар для vladradon
vladradon vladradon на форуме Местный житель
Регистрация: 12.02.2015 / Сообщений: 563
Поблагодарили 281 раз(а) / Репутация: 288
Вот правильныq вариант сразу со степом и стартом
Есть еще один существенный недочет - нет проверки на стоп уровень:
PHP код:
void TrailingStop()
  {
   
double newstop=0;
   
int stoplevel=(int)MarketInfo(_Symbol,MODE_STOPLEVEL);
   if(
TrailingStart<=stoplevelTrailingStart=stoplevel+1;
   if(
TrailingStep<=stoplevelTrailingStep=stoplevel+1;
   for(
int i=OrdersTotal()-1i>=0i--)
      if(
OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(
OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            
//-----------------------------------------------------------
            
if(OrderType()==OP_BUY)
              {
               if(
OrderStopLoss()<=|| OrderStopLoss()<OrderOpenPrice())
                  if(
Bid>(OrderOpenPrice()+(TrailingStart+TrailingStep)*_Point))
                     
newstop=Bid-TrailingStep*_Point;
               if(
OrderStopLoss()>0.0 && Bid>(OrderStopLoss()+TrailingStep*_Point))
                  
newstop=Bid-TrailingStep*_Point;
               if(
newstop>OrderStopLoss() && newstop<Bid-stoplevel*_Point)
                  if(!
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(newstop,_Digits),OrderTakeProfit(),OrderExpiration()))
                     Print(
"Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
              }
            
//-----------------------------------------------------------
            
if(OrderType()==OP_SELL)
              {
               if(
OrderStopLoss()<=0.0 || OrderStopLoss()>OrderOpenPrice())
                  if(
Ask<(OrderOpenPrice()-(TrailingStart+TrailingStep)*_Point))
                     
newstop=Ask+TrailingStep*_Point;
               if(
OrderStopLoss()>0.0 && Ask<(OrderStopLoss()-TrailingStep*_Point))
                  
newstop=Ask+TrailingStep*_Point;
               if(
newstop>&& newstop>Ask+stoplevel*_Point)
                  if(!
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(newstop,_Digits),OrderTakeProfit(),OrderExpiration()))
                     Print(
"Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
              }
           }
  } 
Можно вечно смотреть на то, как горит огонь, как течет вода... и как работает трал...

Последний раз редактировалось vladradon; 23.05.2018 в 10:15.
Milord 
23.05.2018, 12:37
Аватар для MrGreen86
MrGreen86 MrGreen86 на форуме Элитный участник
Регистрация: 12.01.2012 / Сообщений: 857
Поблагодарили 1,155 раз(а) / Репутация: 1155
Есть еще один существенный недочет - нет проверки на стоп уровень:
можно его сделать так. но:
1. корректней проверять настройки на старте и вообще не запускаться советнику если пользователь накосячил. Это все в OnInit потому и не писал это тут.
2. у многих брокеров стоп левел плавающий. Серверная часть MT не позволяет на лету менять параметр стоп левела. В этом случае функция MarketInfo(_Symbol,MODE_STOPLEVEL) возвращает 0 или вообще некорректное значение. Обычно при плавающем стоп левеле он равен двум спредам. т.е. если MarketInfo(_Symbol,MODE_STOPLEVEL) == 0, то stoplevel = ((Ask-Bid)*2)/_Point;

PHP код:
Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError()); 
там нужна полноценная проверка на ошибки а не эта заглушка которая рано или поздно приведет к бану.
Milord 
23.05.2018, 16:36
Аватар для vladradon
vladradon vladradon на форуме Местный житель
Регистрация: 12.02.2015 / Сообщений: 563
Поблагодарили 281 раз(а) / Репутация: 288
там нужна полноценная проверка на ошибки а не эта заглушка которая рано или поздно приведет к бану.
Если новый стоплосс не проходит, то какую проверку ни делай, все равно придется либо лезть в настройки, либо в код. А я предпочитаю вообще в таком случае переключаться на виртуал. И проверку стоп уровня вообще желательно делать отдельно на случай, если несколько ордеров в рынке и новый стоплосс может подойти текущему ордеру для модификации, но влезть в стоп уровень другого ордера. А если стоп уровень плавающий, то лучше ставить на ВПС и с виртуальным тралом или с автоматическим переходом на виртуал при первой же ошибке модификации.
Можно вечно смотреть на то, как горит огонь, как течет вода... и как работает трал...
Milord 
Вчера, 01:32
Аватар для Milord
Milord Milord на форуме Местный знаток
Регистрация: 26.03.2011 / Сообщений: 635
Поблагодарили 711 раз(а) / Репутация: 714
Вот правильныq вариант сразу со степом и стартом
PHP код:
if(TrailingStop>0) {
   for(
int i=OrdersTotal()-1i>=0i--) {
      if(!
OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(
OrderSymbol()!=Symbol()) continue;
      if(
OrderMagicNumber()!=Magic) continue;
      if(
OrderType()==OP_BUY && Bid-OrderOpenPrice() >= TrailingStart*Point) {
         if(
OrderStopLoss() <= Bid-(TrailingStop+TrailingStep)*Point) {
            if(!
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-TrailingStop*Point,Digits),OrderTakeProfit(),0,Green)) {
               
// тут надо проверить ошибку
            
}
         }
      }
      if(
OrderType()==OP_SELL && OrderOpenPrice()-Ask >= TrailingStart*Point) {
         if(
OrderStopLoss() >= Ask+(TrailingStop+TrailingStep)*Point || OrderStopLoss()==0) {
            if(!
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+TrailingStop*Point,Digits),OrderTakeProfit(),0,Green)) {
               
// тут надо проверить ошибку
            
}
         }
      }
   }

спасибо за ваш вариант трала,прикрутил его к советнику, прогнал в тестере,в итоге прибыльность упала почти в 2 раза,как потом выяснил по причине уменьшения числа открытых ордеров,а сейчас факты, без трала:
depo =1000,
profit=2905,
sell -97
buy-43
---------------
а теперь с тралом:
depo=1000
profit=1929
sell -57
buy-2
странно как он влияет на число открытых ордеров, сигнал то на открытие не изменился,по истории сделок тоже видно ,что с тралом он "тянет" только sell ордера,buy -почти нет,лишь 2 штуки..
тестю советники, иногда пишу и дорабатываю их ...
ПУТЬ ДЛИННОЙ В 10000 МИЛЬ НАЧИНАЕТСЯ С 1 ШАГА (Лао Цзы)
Вчера, 08:00
Аватар для MrGreen86
MrGreen86 MrGreen86 на форуме Элитный участник
Регистрация: 12.01.2012 / Сообщений: 857
Поблагодарили 1,155 раз(а) / Репутация: 1155
Если новый стоплосс не проходит, то какую проверку ни делай, все равно придется либо лезть в настройки, либо в код.
зависит от причины почему не проходит, т.е. от кода ошибки.
в каких то ситуация нужно вообще советнику самому себе запретить торговые операции на какое то время (например если рынок закрыт). в каких то обновить цену, в каких то можно долбить дальше если брокер шлет реквоты.
Ответить

Метки
mql4, mql4 помощь, вопросы mql4


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.



Текущее время: 22:36. Часовой пояс GMT.


Перевод: zCarot
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
SEO by vBSEO