Советник на основе АО и АС - страница 3

 

Некоторые замечания/рекомендации

У Вас тип пользовательской функции void тоесть ничего не возвращает данная функция после выполнения ее действий

тогда вы просто не узнаете открылся у Вас ордер или нет в месте откуда данная функция вызывалась (стоит ее повторять или нет) если не прибегать к дополнительному анализирующему блоку

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

а ) если в пользовательскую функцию будут переданы все необходимые переменные в качестве параметров

б) пользовательская функция работает с глобальными перемнными (определенные за пределами какой либо функции)

По рекомендациям "правельнее" вариант "а"... а быстерее ?

 
Добрый день, всем!!! Вот один вопрос на засыпку есть. Подскажите пожалуйста, где я допустил ошибку. Эксперт должен выставлять отложку. При ее срабатывании он должен выставить стоп лосс и ТР. Отложки он выставляет, а вот модифицирует не всегда, то вообще зависает. Вот сам код.

if(BuyTicket<1)
{
double BuyPrice=NormalizeDouble(ObjectGet(BuyLine,OBJPROP_PRICE1),Digits)+OrderIndent*Point;
BuyTicket=OrderSend(Symbol(),OP_BUYSTOP,Lots,BuyPrice,0,0,0,ExpertComment,BuyMagic, 0,BuyColor);
Sleep(1000);
OrderModify(OrderTicket(),OrderOpenPrice(),BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point, 0,CLR_NONE);
}

С уважением Dimi
 
Dimi:
Добрый день, всем!!! Вот один вопрос на засыпку есть. Подскажите пожалуйста, где я допустил ошибку. Эксперт должен выставлять отложку. При ее срабатывании он должен выставить стоп лосс и ТР. Отложки он выставляет, а вот модифицирует не всегда, то вообще зависает. Вот сам код.

if(BuyTicket<1)
{
double BuyPrice=NormalizeDouble(ObjectGet(BuyLine,OBJPROP_PRICE1),Digits)+OrderIndent*Point;
BuyTicket=OrderSend(Symbol(),OP_BUYSTOP,Lots,BuyPrice,0,0,0,ExpertComment,BuyMagic, 0,BuyColor);
Sleep(1000);
OrderModify(OrderTicket(),OrderOpenPrice(),BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point, 0,CLR_NONE);
}

С уважением Dimi



Может стоит попробовать на проверку потока

IsTradeContextBusy( )

и посмотреть

GetLastError( )

когда ордер не промодифицировался

да и вообще бы прежде чем модифицирвать ордер его бы сначала

OrderSelect(....) по тикету наверное проще будет так как он у вас уже есть (BuyTicket)

 

olyakish, я вас правильно понял? Вы предлагаете использоать конструкцию примерно такую для модификации -

for(int i=0; i<OrdersTotal(); i++)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol())
            if (OrderMagicNumber()==BuyMagic) 
              if (BuyTicket=OrderTicket())
          { OrderModify(OrderTicket(),OrderOpenPrice(),B... ....}
И ещё. Как или когда  лучше модифицировать ордер. Пока он находится в состоянии "отложки" ? Либо дождаться , пока он сработает и уже тогда модифицировать (т.е. поставить в него  сл и тп), используя эту же конструкцию ?
 
rid:

olyakish, я вас правильно понял? Вы предлагаете использоать конструкцию примерно такую для модификации -

for(int i=0; i<OrdersTotal(); i++)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol())
            if (OrderMagicNumber()==BuyMagic) 
              if (BuyTicket=OrderTicket())
          { OrderModify(OrderTicket(),OrderOpenPrice(),B... ....}
И ещё. Как или когда лучше модифицировать ордер. Пока он находится в состоянии "отложки" ? Либо дождаться , пока он сработает и уже тогда модифицировать (т.е. поставить в него сл и тп), используя эту же конструкцию ?


У Вас уж есть тикет и не нужно нагружать терминал

проще

if(OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
 {
     OrderModify(.....);
 }

Правда это при условии что ордер уже не успел закрыться ( В истории вроде модифицировать уже нельзя :))

...И ещё. Как или когда лучше модифицировать ордер....

Думаю когда он в отложке его можно быстрее промодифицировать . т.к на некоторых серверах эту операцию выполняет автомат а сработанный ордeр модифицирует (подтверждает уже реальный чел) только это еще и от состояния рынка (новости, размер лота ордера и тд.) да еще и от самого ДЦ зависит какая у них политика . А это тайна за семью печатями :)

А более точно думаю Вам "писатели" MT ответят...

 

И ещё вопрос : как мне лучше/правильнее указать в OrderModify

- вот так: OrderModify(OrderTicket(),OrderOpenPrice()... ...

либо вот так : OrderModify(BuyTicket, OrderOpenPrice()... ...

 
rid:

И ещё вопрос : как мне лучше/правильнее указать в OrderModify

- вот так: OrderModify(OrderTicket(),OrderOpenPrice()... ...

либо вот так : OrderModify(BuyTicket, OrderOpenPrice()... ...


в вашем случае без разницы, если используются функции внутри, надо, что бы нужный ордер был предварительно выбран по OrderSelect

при таком подходе можно и без OrderSelect, ордер выбирается по тикету

OrderModify( gTicket , gPRICE,

 

Благодарю всех! Вроде понятно. Если использовать внутри OrderModify(OrderTicket(), то надо выбирать , используя OrderSelect

А если так: OrderModify(BuyTicket - то можно и без OrderSelect

 
Оlyakish, Rid и YuraZ, спасиб вам огромное за помощь!!! Правда вы тут без меня мою проблему решили,  причем на отлично!!!

С уважением  Dimi.
 
Всем привет, нужна помощь, я тут совсем запутался. В терминале при открытие позиции выбираем трейлинг стоп, и ставим галочку 15 пунктов. Как в MQL4 запрограммировать этот ход, чтоб при открытие позиции сразу устанавливался трейлинг стоп 15 пунктов ?
Причина обращения: