ПОМОГИТЕ c кодоm !

 
ОЧЕНЬ ВАС ПРОШУ ПОМОГИТЕ !!! В следующем коде я проверяю был ли ордер прибыльный или нет ! Если нет то я подсчитываю количество !!
Если первая сделка была убыточна то запускается цикл по подсчитыванию и добавляется вечно.

Но тут такой прикол !!! Что Если сделка прибыльна то все последующие убыточные ордера подсчитывает нормально ....

double orderProf; // Счетчик количества убыточных сделок

double CalculateLots(){
double Res=0.01;
bool bProfit=true;
int PrevTime=-1;
double tmpLots;
for (int i=0;i<OrdersHistoryTotal();i++){
if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
if (OrderSymbol()!=Symbol()) continue;
if (OrderCloseTime()<PrevTime) continue;
PrevTime=OrderCloseTime();
if (OrderProfit()>0){bProfit=true; orderProf=0;} if (OrderProfit()<0) {bProfit=false; orderProf++;}
tmpLots=OrderLots();
}


return(Res);
}
 
Ну вот, Вы вычисляете-вычмсляете, а потом выводите Res, который не изменяется.
 
Roger:
Ну вот, Вы вычисляете-вычмсляете, а потом выводите Res, который не изменяется.

Res - у меня вычисляется ... дальше ...

Проблема обозначена красным цветом !

 

А где Вы определяете double orderProf; ?

Если внутри цикла, то он каждый раз обнуляется. 

Лучше так static double orderProf;  

 

определяю за main() в самом теле вызываю функцию CalculateLots(). Никаких циклов нет ..........

Почему когда в первый раз проверяется событие if (OrderProfit()<0) {bProfit=false; orderProf++;}, и мы туда заходим то orderProf++ почему то зацикливается, но в последующих заходах в этот if работает - НОрмально .... и orderProf++ теперь уже подсчитывается так как нужно !!!


static - не помогает ...

 
itum:

определяю за main() в самом теле вызываю функцию CalculateLots(). Никаких циклов нет ..........

Почему когда в первый раз проверяется событие if (OrderProfit()<0) {bProfit=false; orderProf++;}, и мы туда заходим то orderProf++ почему зацикливается, но в последующих заходах в этот if работает - НОрмально .... и orderProf++ теперь уже подсчитывается так как нужно !!!

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

if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;

Какой смысл продолжать цикл если не удалось выбрать ордер. Поэтому грамотнее break, а не continue.
И еще, в какую сторону вы хотите считать ордера из истории? В вашем случае вы каждый раз ищите начиная с самого старого (под номером 1), если вам нужно начинать с последней убыточной позиции (а я так понял), то вам нужно организовать цикл в обратную сторону.

for(int i = OrdersHistoryTotal();i > 0;i--)
 

Я думаю с брейком Вы очень погорячились. Конструкция хоть и неидеальная, но работает правильно.

To itum Поставьте сразу за циклом for - Print("orderprof - ",orderProf)

и посмотрите, что он напишет.

 

ну ни одной правильной строки...

int HistoryLossCounter(){int losscount = 0;
  for(int i = 0; i < OrdersHistoryTotal(); i++){
    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
      if(OrderSymbol()==Symbol()){
        if(OrderProfit()<0){losscount++;}
      }
    }
  }
return(losscount);
}
 

Ты просто подсчитаешь сколько было убыточных ордеров за всю историю.

 
Roger:

Ты просто подсчитаешь сколько было убыточных ордеров за всю историю.


я - да, так и задача какая ?

ОЧЕНЬ ВАС ПРОШУ ПОМОГИТЕ !!!

В следующем коде я проверяю был ли ордер прибыльный или нет ! - какой именно ордер????

Если нет то я подсчитываю количество !! - количество коров?


Если первая сделка была убыточна то запускается цикл по подсчитыванию и добавляется вечно. ??????? вощще непонятно

 
xrust:

В следующем коде я проверяю был ли ордер прибыльный или нет ! - какой именно ордер????

Насколько я понял, имеется в виду последний.

Если нет то я подсчитываю количество !! 

По идеи, если последний убыточный, то считается общее их количество.

Если первая сделка была убыточна то запускается цикл по подсчитыванию и добавляется вечно. ??????? вощще непонятно

Действительно странно. И вот это еще:

Что Если сделка прибыльна то все последующие убыточные ордера подсчитывает нормально ....

Зачем проверять после прибыльной? Это противоречит написанному выше.

Причина обращения: