Help!!!!!!!

 

Есть функция проверки: если есть сигнал на Бай (b=1)то запускается эта функция. и если последний ордер Бай был закрыт по стоплоссу, т о покупка отменяется. (b=0), для селл ткакя же проверка. Вот код:

void Check_History()

{

int cnt;

for(cnt=OrdersHistoryTotal();cnt>0;cnt--)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY);

{if(OrderMagicNumber()== mag &&

OrderSymbol()==Symbol())

{ if (OrderType() == OP_BUY && OrderClosePrice()<=OrderStopLoss()) {b=0; break;}

if (OrderType() == OP_SELL && OrderClosePrice()>=OrderStopLoss()) {s=0; break;}

if (OrderType() == OP_BUY && OrderClosePrice()>OrderStopLoss()) break;

if (OrderType() == OP_SELL && OrderClosePrice()<OrderStopLoss()) break;

}

}

}

}

Так вот если полседний Бай был закрыт по стоплоссу и селл также был закрыт по стоплоссу, то вылазит ошибка 4105 (Ни один ордер не выбран.) Почему ?

Как этого избежать ?

 
dimeon:

Есть функция проверки: если есть сигнал на Бай (b=1)то запускается эта функция. и если последний ордер Бай был закрыт по стоплоссу, т о покупка отменяется. (b=0), для селл ткакя же проверка. Вот код:

void Check_History()

{

int cnt;

for(cnt=OrdersHistoryTotal();cnt>0;cnt--)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY);

{if(OrderMagicNumber()== mag &&

OrderSymbol()==Symbol())

{ if (OrderType() == OP_BUY && OrderClosePrice()<=OrderStopLoss()) {b=0; break;}

if (OrderType() == OP_SELL && OrderClosePrice()>=OrderStopLoss()) {s=0; break;}

if (OrderType() == OP_BUY && OrderClosePrice()>OrderStopLoss()) break;

if (OrderType() == OP_SELL && OrderClosePrice()<OrderStopLoss()) break;

}

}

}

}

Так вот если полседний Бай был закрыт по стоплоссу и селл также был закрыт по стоплоссу, то вылазит ошибка 4105 (Ни один ордер не выбран.) Почему ?

Как этого избежать ?

RTFM про массивы - у Вас ошибка в алгоритме. Заодно поиском воспользуйтесь.
 

исправил OrdersHistoryTotal() на OrdersHistoryTotal()-1

Так не помогло ...

Можно выложить правильный код ?

 
dimeon:

исправил OrdersHistoryTotal() на OrdersHistoryTotal()-1

Так не помогло ...

Можно выложить правильный код ?

Чет настроение седня .... В логике Вашей не разбирался и вообще менять внешние переменные внутри функций - плохой стиль: это источник ошибок.

Пробуйте, написал на скорую руку :

bool IsLastOpenSignalValid(string SYMBL, int ordT=OP_BUY, int MGCK=0)
{
    if((ordT!=OP_BUY)||(ordT!=OP_SELL)) return(false);
    for(int cnt=OrdersHistoryTotal()-1;cnt>=0;cnt--)
    {

        if(!OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY)) break;
        if( (((MGCK!=0))&&(OrderMagicNumber()!= MGCK)) || (OrderSymbol()!=SYMBL) ) continue;
        if(OrderType()!=ordT) continue;
        double ordCls = NormalizeDouble(OrderClosePrice(),Digits);
        double ordStp = NormalizeDouble(OrderStopLoss(),  Digits);
        switch(ordT)
        {
            case OP_BUY:
                if(ordCls<=ordStp) return(false);
                return(true);
            case OP_SELL:
                if(ordCls>=ordStp) return(false);
                return(true);
            default: return(false); // If Wrong Opder Type
        }
    }
    return(true);// If OrderType is not Found 
}//bool IsLastOpenSignalValid(string SYMBL, int ordT=OP_BUY, int MGCK=0)


Не тестировал - проверяйте.