Доработка советника

 

Коллеги, добрый день. Есть часть кода из советника. Он удаляет отложенные ордера, когда проходит определенное количество секунд

order_delete

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

if (!is_end&&TimeCurrent()>=time_news+order_delete) is_end=true;

например задействовать переменную stepmin - это будет количество пунктов, когда нужно удалить ордер. 

if (!is_end&&TimeCurrent()>=Текущая цена + stepmin) is_end=true;

Возможно так сделать? Не пойму как обозначить в коде текущую рыночную цену. 


Часть кода

input int      Order_ID=-1;
input string   COMMENT="Forest52";
input datetime time_news=__DATETIME__;
input int      _start=10;
input int      order_delete=10;
input double   lot=0.5;
input int      stepmin=20;
input int      stepmax=20;
input uint     sleep=100;
input int      BU=20;
input int      SL=20;
input int      TP=20;
input int      Spread=100;
input int      Tral=50;   
input bool     AutoClose=true;
input bool     BuyStop=true;
input bool     SellStop=true;

long timer_flag=0,
     lever=AccountInfoInteger(ACCOUNT_LEVERAGE);
bool is_timer=false, is_job=false, is_start=false, is_end=false;
double K,
       lotsize=MarketInfo(_Symbol,MODE_LOTSIZE);
SOrder Buy, Sell, Order[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit(){
   if (!PointPriceToUSD(K)){
      Alert("Невозможно определить цену пункта. Проверьте необходимые инструменты в окне озора рынка и повторно запустите эксперт.");
      return(INIT_FAILED);}
   ArrayResize(Order,1);      
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick(){
   PointPriceToUSD(K);
   if (!is_start&&TimeCurrent()>=time_news) is_start=true;
   if (!is_end&&TimeCurrent()>=time_news+order_delete) is_end=true;
   if (is_job) OrdersControl();
   if (!is_start&&Order_ID<=0) OrdersInit();
   if (is_timer||is_end) {Notefication();return;}
   if (!is_job&&TimeCurrent()>=time_news-60*(1+_start/60)){
      timer_flag=GetTickCount()+1000*(time_news-_start-TimeCurrent()-1);
      if (EventSetMillisecondTimer(100)) is_timer=true;}
   Notefication();}
 
Evgenii Kasimov:

Коллеги, добрый день. Есть часть кода из советника. Он удаляет отложенные ордера, когда проходит определенное количество секунд

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

например задействовать переменную stepmin - это будет количество пунктов, когда нужно удалить ордер. 

Возможно так сделать? Не пойму как обозначить в коде текущую рыночную цену. 


Часть кода

Текущая рыночная цена это переменные Ask и Bid. Если по другому инструменту, то:

double fAsk = SymbolGetDouble(<другой символ>, SYMBOL_ASK);
double fBid = SymbolGetDouble(<другой символ>, SYMBOL_BID);
 

Если возможно помогите, как это можно отразить в коде

  if (!is_end&&TimeCurrent()>=time_news+order_delete) is_end=true;
 
Evgenii Kasimov:

Если возможно помогите, как это можно отразить в коде

Здесь - никак. Для начала нужно выбрать нужный ордер (через OrderSelect(), проходя по списку рабочих ордеров), а потом уже:

fabs(fAsk - OrderOpenPrice()) > количество пунктов, переведенных в категорию цены

или

fabs(fBid - OrderOpenPrice()) > количество пунктов, переведенных в категорию цены
Причина обращения: