Господа MQL4 програмисты помогите с написанием блока в советнике.

 

Господа MQL4 програмисты помогите с написанием блока в советнике.

Задача такая: необходимо брать закрытые последнии ордера из истории и если профит отрицательный необходимо умножить рабочий лот на некую величину 1, если он положительный но вссе равно меньше некой величины 2, то лот остается прежним, если профит в последней закрытой сделке больше величины 2, то лот обнуляется и цыкл увеличения лота повторяется, пока встречаются отрицательные сделки. Лот необходимо просчитывать и изменять после каждой закрытой сделки. 

Скинте кодик кому не сложно. Хочу дописать свой советник вот тест (прилагаю)

спасибо.

Файлы:
test.rar  995 kb
 
/*Функция вычисляет лот в зависимости от последнего зафиксированного лота
  Аргументы:
  k- величина 1, на которую умножается рабочий объем при последнем 
     отрицательном профите,
  max_profit-величина 2,
  magic-Magic Number позиций эксперта,                                  */
double get_lot(double k,double max_profit, int magic)
{
   double lot=0.1,last_profit=0,last_lot=0;
   datetime last_time=0;
        
   for(int i=0;i<0;i++)
   {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) 
         { 
            if(OrderSymbol()!=Symbol()||OrderType()>OP_SELL) 
                 continue;
            if(OrderMagicNumber()!=magic)
                continue;
                
            if(OrderCloseTime()>last_time)
            {
                last_time=OrderCloseTime();
                last_profit=OrderProfit();
                last_lot=OrderLots();
            }
         }
   }
   if(last_time>0)
   {
        if(last_profit<0)
            lot=k*last_lot;
        else if(last_profit>0&&last_profit<max_profit)
            lot=last_lot;
   }
   return(lot);
}
 
вставил функцию стала вылазить предупреждение во время проверки такое вот: Function "get_lot" is not referenced and will be removed from exp-file 
Что это значи? кто подскажет.
 

Это значит что функцию надо вызвать, для того чтобы она начала работать...

 

Dmitrii610, во внешние параметры эксперта вставьте

extern int       Magic     =96784; 
extern double      k = 1.4;
extern double      max_profit = задать профит;

А перед функциями OrderSend задайте сам вызов функции -

(только с постоянным размером лота тож решите вопрос)

Lots=get_lot()// Покупаем :
  ticket=OrderSend(Symbol(),0,Lots,... ...
 

Где я сделал ошибку? выдает такоую ошибку:  ')' - wrong parameters count 



extern int MaximumRisk=4;
extern double k=1.1;
extern double max_profit=90;
extern int MinLots=2;
extern int Rezerv=0;
extern bool LotConst=false;
extern double lots=0.1;
extern int MagicNumber=5589144;


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double get_lot(double lot)
{
 double lot=NormalizeDouble((AccountBalance( ) + Rezerv)*MaximumRisk/(StopLoss*1000),MinLots);
   if (LotConst)lot=lots;

   double last_profit=0,last_lot=0;
   datetime last_time=0;
        
   for(int i=0;i<0;i++)
   {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
         {
            if(OrderSymbol()!=Symbol()||OrderType()>OP_SELL)
                 continue;
            if(OrderMagicNumber()!=MagicNumber)
                continue;
                
            if(OrderCloseTime()>last_time)
            {
                last_time=OrderCloseTime();
                last_profit=OrderProfit();
                last_lot=OrderLots();
            }
         }
   }
   if(last_time>0)
   {
        if(last_profit<0)
            lot=k*last_lot;
        else if(last_profit>0&&last_profit<max_profit)
            lot=last_lot;
   }
   return(lot);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
  int start()
  {

   double BuyPrice;
   double BuyStopLoss;
   double BuyTakeProfit;
   double SellPrice;
   double SellStopLoss;
   double SellTakeProfit;
   double StopLoss;
  
  
//----
   bool need_long =true;
   bool need_short=true;
  
      if(need_long)
         lots=get_lot();
         ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,BuyPrice,3,BuyStopLoss,BuyTakeProfit,"",MagicNumber,0,Green);
      if(need_short)
         lots=get_lot();
         ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,SellPrice,3,SellStopLoss,SellTakeProfit,"",MagicNumber,0,Red);
    
  }
//+------------------------------------------------------------------+



 

в функции get_lot()

double get_lot(double lot)

{

}

Ты объявил её как функцию принимающую один аргумент double типа, а при её вызове никаких её параметров в аргументе не передаешь:

lots=get_lot(/*вот тут должен быть аргумент*/);

 

 все исправил ошибок не выдает только теперь советник стал открывать кучу новых ордеров вместо одного. что делать? 

(код только упраления капиталом надеюсь понятно)

extern int MaximumRisk=4;
extern double k=1.1;
extern double max_profit=90;
extern int MinLots=2;
extern int Rezerv=0;
extern bool LotConst=false;
extern double lots=0.1;
extern int MagicNumber=5589144;


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double get_lot(double k,double max_profit, int MagicNumber)

{
 double lot1=NormalizeDouble((AccountBalance( ) + Rezerv)*MaximumRisk/(StopLoss*1000),MinLots);
 
   if (LotConst)lot1=lots;
   double lot=lot1;
   double last_profit=0,last_lot=0;
   datetime last_time=0;
        
   for(int i=0;i<0;i++)
   {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) 
         { 
            if(OrderSymbol()!=Symbol()||OrderType()>OP_SELL) 
                 continue;
            if(OrderMagicNumber()!=MagicNumber)
                continue;
                
            if(OrderCloseTime()>last_time)
            {
                last_time=OrderCloseTime();
                last_profit=OrderProfit();
                last_lot=OrderLots();
            }
         }
   }
   if(last_time>0)
   {
        if(last_profit<0)
            lot=k*last_lot;
        else if(last_profit>0&&last_profit<max_profit)
            lot=last_lot;
   }
   return(lot);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
  int start()
  {
   int cnt, ticket;
   string TradeSymbol=Symbol();
   double BuyPrice;
   double BuyStopLoss;
   double BuyTakeProfit;
   double SellPrice;
   double SellStopLoss;
   double SellTakeProfit;
   double StopLoss;
   
//----
   bool need_long =true;
   bool need_short=true;
  
      if(need_long)
         lots=get_lot(k, max_profit, MagicNumber);
         ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,BuyPrice,3,BuyStopLoss,BuyTakeProfit,"",MagicNumber,0,Green);
      if(need_short)
         lots=get_lot(k, max_profit, MagicNumber);
         ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,SellPrice,3,SellStopLoss,SellTakeProfit,"",MagicNumber,0,Red);
     
  }
//+------------------------------------------------------------------+
 

Учить MQL4.

Если в твоем эксперте нужно работать только одной позцией, то перед её открытие нужно провести проверку на наличие открытых.

Это можно сделать с помощью функции ExistPositions(), либо как вариант попроще использовать функцию OrdersTotal()

Например:

if(OrdersTotal()==0)

{

//тут открываем позции

}

 

у вас почему-то функция int start() повисла в воздухе.Может её нужно завершить
return(0); ?

И ещё. Если вы в внеш. парамерах задаёте постоянный размер лота (extern double lots=0.1;)
. То зачем вам блок расчета лотов?

Я ничего не трогал там. Только вставил проверку наличия позиций.

==примерно так можно ограничить число открытых позиций. В конце кода поставлена функция проверки наличия ордеров эксперта. А перед открытием позиций реализован её вызов

if (!ExpertOrder(MagicShort)) {//если открытых позиций нет

тогда ваш код будет :

( не забудьте "закрыть" функцию int start() )

extern int MaximumRisk=4;
extern double k=1.1;
extern double max_profit=90;
extern int MinLots=2;
extern int Rezerv=0;
extern bool LotConst=false;
extern double lots=0.1;
extern int MagicNumber=5589144;


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double get_lot(double k,double max_profit, int MagicNumber)

{
double lot1=NormalizeDouble((AccountBalance( ) + Rezerv)*MaximumRisk/(StopLoss*1000),MinLots);

   if (LotConst)lot1=lots;
   double lot=lot1;
   double last_profit=0,last_lot=0;
   datetime last_time=0;
        
   for(int i=0;i<0;i++)
   {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) 
         { 
            if(OrderSymbol()!=Symbol()||OrderType()>OP_SELL) 
                 continue;
            if(OrderMagicNumber()!=MagicNumber)
                continue;
                
            if(OrderCloseTime()>last_time)
            {
                last_time=OrderCloseTime();
                last_profit=OrderProfit();
                last_lot=OrderLots();
            }
         }
   }
   if(last_time>0)
   {
        if(last_profit<0)
            lot=k*last_lot;
        else if(last_profit>0&&last_profit<max_profit)
            lot=last_lot;
   }
   return(lot);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
  int start()
  {
   int cnt, ticket;
   string TradeSymbol=Symbol();
   double BuyPrice;
   double BuyStopLoss;
   double BuyTakeProfit;
   double SellPrice;
   double SellStopLoss;
   double SellTakeProfit;
   double StopLoss;
   
//----
   bool need_long =true;
   bool need_short=true;

if (!ExpertOrder(MagicShort)) {//если открытых позиций нет
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж   
      if(need_long)
         lots=get_lot(k, max_profit, MagicNumber);
         ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,BuyPrice,3,BuyStopLoss,BuyTakeProfit,"",
MagicNumber,0,Green);
      if(need_short)
         lots=get_lot(k, max_profit, MagicNumber);
         ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,SellPrice,3,SellStopLoss,SellTakeProfit,"",
MagicNumber,0,Red);
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
  } //если открытых позиций нет
    
  }
//+------------------------------------------------------------------+

//---- Функция проверки наличия ордеров эксперта -----------------------+
//----------------------------------------------------------------------+
// false - ордеров данного эксперта нет;                                |
// true  - есть ордера данного эксперта;                                |
//----------------------------------------------------------------------+
bool ExpertOrder (int VersionID){
bool result=false;
int  _OrdersTotal=OrdersTotal();
if (_OrdersTotal>0) {for (int jk=0; jk<_OrdersTotal; jk++) {   
      if (OrderSelect(jk, SELECT_BY_POS, MODE_TRADES)) {
        if (OrderMagicNumber()==VersionID) 
          { result=true;  break; }//Найден ордер принадлежащий эксперту
        else  { result=false; } 
       } } } else { result=false; }  
//---------------------        
return(result);} 
Причина обращения: