Помогите разобраться с объявлением функции!!!

 

Всем добрый день!

Помогите чем сможете!

Не могу разобраться с объявлением функции.

Хочу себе сделать на первых порах набор наподобии Кимовских функций (только более простых).

Ниже попытка сделать такое на простом примере.

только вот несколько ошибок вылетет, а понять почему не могу!

//+------------------------------------------------------------------+
//| MA.mq4 |
//| Sokolov Dmitrij Pavlovich |
//| |
//+------------------------------------------------------------------+
#property copyright "SDP"
#property link ""
extern int bar=0;
extern int PeriodMA=2; //Период усреднения для вычисления скользящего среднего
extern int MetodMA=3; //Метод вычисления скользящего среднего: 0-MODE_SMA; 1-MODE_EMA; 2-MODE_SMMA; 3-MODE_LWMA
extern int PriceHighMA=2; //Используемая цена. Может быть любой из ценовых констант: 0-6

//+-----------------------+
//| expert start function |
//+-----------------------+
void start()
{
if(ma(bar)>ma(bar+1)){OrderSend(Symbol(),OP_BUY,0.1,Bid,2,0,0,"Koment",0,0,Blue);return;}
else {PosBuyAllClose()}
return;
}
//+-----------------------+
//| end function |
//+-----------------------+

//+--------Функция MA---------------------------+
double ma(int a=0){double b=iMA(Symbol(),PERIOD_H1,PeriodMA,0,MetodMA,PriceHighMA,a); return(b);}
//+---------------------------------------------+

//---------Закрытие всех позиций BUY------------+
void PosBuyAllClose(bool closepos)
{
int i;
for( i=0;i<OrdersTotal();i++)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType()==OP_BUY) {OrderClose(OrderTicket(),OrderLots(),Bid,2,Red); return;}
}
return;
}
//---------------------------------------------+

 
Нельзя обьявлять функцию в другой функции.
 
WWer писал (а) >>
Нельзя обьявлять функцию в другой функции.

Исправил.

Это я просто не доглядел,

Но все равно не понимаю как заставить работать функцию PosBuyAllClose.

Объясните кто может!

 

например так:

void PosBuyAllClose(){int i;
  for(i=OrdersTotal();i>0;i--){//Обратный отсчет при удалении для того чтобы не пропускать ордера
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){//условие нахождения ордера чтобы избежать ошибки 4108
      if(OrderType()<1){OrderClose(OrderTicket(),OrderLots(),Bid,2,Red);}
    }
  }
return;
}
 
xrust писал (а) >>
  for(i=OrdersTotal();i>0;i--){//Обратный отсчет при удалении для того чтобы не пропускать ордера

Тогда не удалится ордер с позицией 0 (і=0), нужно написать:

  for(i=OrdersTotal();i>=0;i--)
 
да упустил, бывает
 
WWer писал (а) >>

Тогда не удалится ордер с позицией 0 (і=0), нужно написать:

  for(i=OrdersTotal();i>=0;i--)


Неправильно.

 
Parabellum писал (а) >>

Неправильно.

А можно поинтерисоватся где ошибка?

 
Нет ордера с номером OrdersTotal().
 
Roger писал (а) >>
Нет ордера с номером OrdersTotal().

А ну да... что-то даже не заметил, спасибо за замечание. Но все же даже если написать OrdersTotal(),

то такая конструкция будет работать.

 

эта конструкция по любому работать будет

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