Помогите запутался....

 

Проблема в следующем.

На границах канала выставляются отложенные (стоповые) ордера, это делает советник или вручную.

Я хочу, после того как один из пары ордеров сработает (станет рыночным) программа должна выставить дополнительный "стоповый" ордер но уже по средине канала (шаг можно регулировать)....

Ниже сама программа.

Проблема в том, что иногда она работает корректо (выставляя один ордер), а иногда может выставить целую "пачку" ордеров на одном уровне.....

/* Отредактировано модератором, для вставки кода есть кнопка SRC */

extern int SL = 570;    
extern int TP = 15;
extern double lot = 0.05;       
extern bool one_step = true;    
extern int step_k = 2;  
extern int step_mg = 444;       

double Sl_step, Tp_step, Pr_step, step_price;
int y, j, f, step_mgk;

void init() {
}
void deinit() {
}
int start() { 
RefreshRates();
step_mgk = step_mg + TimeDayOfYear(TimeCurrent());
if (one_step) {
for (j=0; j<=OrdersTotal(); j++) {
if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symbol() && OrderType()<2 && OrderMagicNumber()!=step_mgk) f_one_step();     
}       }       }
return(0);
}

void f_one_step() {
RefreshRates();
bool tic_step_buy = false;
bool tic_step_sell = false;


// запоминаем значения сработавшего ордера 
string step_kmnt_1 = OrderComment();
int step_mgc_1 = OrderMagicNumber();
int step_tpn_1 = OrderType();
double step_opn_1 = OrderOpenPrice();
if(TimeCurrent() - OrderOpenTime()>120) return(0);


// проверяем наличие парного отложенного ордера 
int step_test = 0;
for (y=0; y<=OrdersTotal(); y++) {
if (OrderSelect(y, SELECT_BY_POS, MODE_TRADES)) {
if (OrderMagicNumber()==step_mgc_1 && OrderComment()==step_kmnt_1 && OrderType()>3) {
step_test = step_test + 1;
double step_opn_2 = OrderOpenPrice();
int step_tpn_2 = OrderType();
datetime step_close = OrderExpiration();
}       }       }       
if (step_test != 1) return(0);

// рассчитываем уровень "стЕпового" ордера      
step_price = NormalizeDouble(step_opn_1-(step_opn_1-step_opn_2)/step_k, Digits);

int step_test_2 = 0;    
for (f=0; f<=OrdersTotal(); f++) {
if (OrderSelect(f, SELECT_BY_POS, MODE_TRADES)) {
if (OrderMagicNumber()==step_mgk && OrderOpenPrice()==step_price) {
step_test_2 = step_test_2 + 1;
}       }       }
if (step_test_2 != 0) return(0);

if (step_test_2==0){


if (step_tpn_2 == 4){
Sl_step = NormalizeDouble(step_price - SL*Point, Digits);
Tp_step = NormalizeDouble(step_price + TP*Point, Digits);
while(!tic_step_buy){   
if(IsTradeAllowed()) tic_step_buy = OrderSend(Symbol(), OP_BUYSTOP, lot, step_price, 2,
Sl_step, Tp_step, "step"+step_kmnt_1, step_mgk, step_close, MintCream);
if(tic_step_buy) {
PlaySound("ok.wav");
break;  }       }       }


if (step_tpn_2 == 5) {
Sl_step = NormalizeDouble(step_price + SL*Point, Digits);
Tp_step = NormalizeDouble(step_price - TP*Point, Digits);
while(!tic_step_sell){
if(IsTradeAllowed()) tic_step_sell = OrderSend(Symbol(), OP_SELLSTOP, lot, step_price, 2,
Sl_step, Tp_step, "step"+step_kmnt_1, step_mgk, step_close, MintCream);
if(tic_step_sell) {
PlaySound("ok.wav");
break;  }       }       }       }


return(0);
}
 
renoshnik:

Проблема в следующем.

На границах канала выставляются отложенные (стоповые) ордера, это делает советник или вручную.

Я хочу, после того как один из пары ордеров сработает (станет рыночным) программа должна выставить дополнительный "стоповый" ордер но уже по средине канала (шаг можно регулировать)....

Ниже сама программа.

Проблема в том, что иногда она работает корректо (выставляя один ордер), а иногда может выставить целую "пачку" ордеров на одном уровне.....

/* Отредактировано модератором, для вставки кода есть кнопка SRC */


В коде есть одна ошибка, связанная с предположением, что функция OrderOpenPrice() возвращает нормализованную цену. Однако, это не так. Поэтому, следует переделать сравнение

if (OrderMagicNumber()==step_mgk && OrderOpenPrice()==step_price) ...

например, в такое

if (OrderMagicNumber()==step_mgk && MathAbs(OrderOpenPrice()-step_price)<Point) 

Ну, и везде в циклах <=OrdersTotal(); заменить на <OrdersTotal();

Хотя это и не влияет на результат. Так, просто для порядка.

 
Огромное спасибо !!! Действительно, в этом причина....
Причина обращения: