Помогите найти ошибку в функции

 

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

#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern int MN = 123;

extern double Lot = 0.01;
extern double Mnozhitel = 2;

int cik;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//---- 
double lots = LotMartingal (OP_SELL);
double lotb = LotMartingal (OP_BUY);
OrderSend (Symbol(), OP_SELL, lots, Bid, 3, 0, 0, 0, MN, 0, CLR_NONE);
OrderSend (Symbol(), OP_BUY, lotb, Ask, 3, 0, 0, 0, MN, 0, CLR_NONE);

//----
   return(0);
  }
//+------------------------------------------------------------------+

double LotMartingal (int OrType)
//функция выдае лот по Мартингалу, опираясь на наибольший лот открытого ордера, умножая его на множитель
//если ордер отсутствует то лот = первоначальному
{
if (OrType > 5 && OrType < 0)
     {
     Print ("LotMartingal (int OrType) Ошибка типа ордера");
     return (-1);
     }
     
double lot1, lot2 = 0;
int cik;
int err;
int errs = 100;

for (cik = OrdersTotal() - 1; cik >= 0; cik --)
     {
     if (!OrderSelect (cik, SELECT_BY_POS, MODE_TRADES))
          {
          err = GetLastError();          
          Print ("LotMartingal Ошибка №", err);           
          if( err == 4 || err == 137 || err == 146 || err == 136 && errs > 0)
               {
               errs --;
               cik ++;
               Sleep (1000);
               continue;
               }      
          }  
     else
          if (OrderMagicNumber() == MN
             && OrderSymbol() == Symbol()
             && OrderType() == OrType)           
               {                 
               lot1 = OrderLots();//поиск перебором
               if (lot1 > lot2)
                    lot2 = lot1;
                 
               //lot2 = OrderLots();//поиск от последнева
               //break;               
               }            
     }
     
if (lot2 == 0)
     {
     lot2 = Lot;
     return (lot2);
     }
     
if (lot2 > 0)
     {
     lot2 = lot2 * Mnozhitel; 
     NormalizeDouble (lot2, Digits); 
     }  
return (lot2);                      
}
Файлы:
aujvn.mq4  4 kb
 
ERR_NO_ERROR0Торговая операция прошла успешно.


это NormalizeDouble (lot2, Digits); лишнее..

проверка дожна быть

if (lots!=-1) OrderSend (Symbol(), OP_SELL, lots, Bid, 3, 0, 0, 0, MN, 0, CLR_NONE);
if (lotb!=-1) OrderSend (Symbol(), OP_BUY, lotb, Ask, 3, 0, 0, 0, MN, 0, CLR_NONE);

 

Между прочим, в справке ничего не написано про применение GetLastError() к OrderSelect(...)

 

ни что не запрещает вызывать по делу и без дела GetLastError()..

имхо, в for первый блок if(true) изврат какой-то, но кто-то любит "и по горячее"..

 
Integer писал(а) >>

Между прочим, в справке ничего не написано про применение GetLastError() к OrderSelect(...)

ну как же.. "Функция выбирает ордер для дальнейшей работы с ним. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError()." это из справки...
 
keekkenen писал(а) >>
ERR_NO_ERROR 0 Торговая операция прошла успешно.

это NormalizeDouble (lot2, Digits); лишнее..

проверка дожна быть

if (lots!=-1) OrderSend (Symbol(), OP_SELL, lots, Bid, 3, 0, 0, 0, MN, 0, CLR_NONE);
if (lotb!=-1) OrderSend (Symbol(), OP_BUY, lotb, Ask, 3, 0, 0, 0, MN, 0, CLR_NONE);

Это все понятно.....)).. в самой функции если изменить кол-во ордеров которые получаем при помощи тотал выдается ошибка..но 0

 
keekkenen писал(а) >>

ни что не запрещает вызывать по делу и без дела GetLastError()..

имхо, в for первый блок if(true) изврат какой-то, но кто-то любит "и по горячее"..

да я уже раза три переписал в разном виде...;))

 
А почему у тебя вообще пишется ошибка, по твоему коду программа никогда в ту часть, где есть Print не зайдет. И ошибки которые ты проверяешь, никогда не появятся, чтобы посмотреть историю открытых ордеров, терминал не обращается к серверу. Выдай, пожалуйста, какую запись об ошибке выдает терминал.
 
Roger писал(а) >>
А почему у тебя вообще пишется ошибка, по твоему коду программа никогда в ту часть, где есть Print не зайдет. И ошибки которые ты проверяешь, никогда не появятся, чтобы посмотреть историю открытых ордеров, терминал не обращается к серверу. Выдай, пожалуйста, какую запись об ошибке выдает терминал.

2008.11.20 17:40:47 2008.11.10 01:00 проба USDJPY,M5: LotMartingal Ошибка №0
я как бы искусственно ставлю ордеров больше, чтобы проверить..., уходим в обработку ошибок, вызываем гетласт и.. почему ошибка 0?

да..похоже на счет ошибок занятости потока я погорячился..спасибо...но всеравно когда уходим на ошибку ее код 0..

 

ошибка 0 это значит нет ошибки.. игнорируй это значение..

 
keekkenen писал(а) >>

ошибка 0 это значит нет ошибки.. игнорируй это значение..

Просто я подумал раз я направляю прогу по не правильному пути то и при переходе в ветку обработки ошибок..САМ ФАКТ ПЕРЕХОДА говорит что ошибка была но ее код как будто небыло...

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