[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 123

 

куда дописать трейлин стоп и безубыточный вывод ? и что то не увеличивает лот при увилечении депозита

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int Buy (int StopLoss = 0, int TakeProfit = 0, double Lot = 0)

{

int Ticket = 0;

double SL = 0;

double TP = 0;

double VolumeLot = 0;

RefreshRates();

if (StopLoss != 0)

SL = NormalizeDouble(Bid-StopLoss*Point, Digits);

if (TakeProfit != 0)

TP = NormalizeDouble(Ask+TakeProfit*Point, Digits);

if (Lot == 0)

VolumeLot = GetLot ();

else

VolumeLot = Lot;

Ticket = OrderSend(Symbol(), OP_BUY, VolumeLot, NormalizeDouble(Ask, Digits), 20, SL, TP, NULL, AccountNumber(), 0, Green);

if (Ticket == -1)

{

return (GetLastError ());

}

else

{

return (Ticket);

}

}

int Sell (int StopLoss = 0, int TakeProfit = 0, double Lot = 0)

{

int Ticket = 0;

double SL = 0;

double TP = 0;

double VolumeLot = 0;

RefreshRates();

if (StopLoss != 0)

SL = NormalizeDouble(Ask+StopLoss*Point, Digits);

if (TakeProfit != 0)

TP = NormalizeDouble(Bid-TakeProfit*Point, Digits);

if (Lot == 0)

VolumeLot = GetLot ();

else

VolumeLot = Lot;

Ticket = OrderSend(Symbol(), OP_SELL, VolumeLot, NormalizeDouble(Bid, Digits), 20, SL, TP, NULL, AccountNumber(), 0, Red);

if (Ticket == -1)

return (GetLastError ());

else

return (Ticket);

}

double GetLot ()

{

int lot;

if (AccountBalance()>=300) lot=0.01;

if (AccountBalance()>=500) lot=0.02;

if (AccountBalance()>=800) lot=0.03;

return (lot);

}

 
mahla:

куда дописать трейлин стоп и безубыточный вывод ? и что то не увеличивает лот при увилечении депозита

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

В советнике

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

Функция увеличения лота...... наверное лучше поменять

пример:

extern double Lots               = 0.1;
extern double MaximumRisk        = 0.02;
extern double DecreaseFactor     = 3;
//////
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lot=Lots;
   int    orders=HistoryTotal();     // history orders total
   int    losses=0;                  // number of losses orders without a break
//---- select lot size
   lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
//---- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
         //----
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;
        }
      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//---- return lot size
   if(lot<0.1) lot=0.1;
   return(lot);
  }

Посмотрите в Moving Average.mq4

 

Подскажите пожалуйста, как в советнике использовать bollinger bands построенный не для значений цены, а для значений momentum? я попробовал вот так:

BandOPeriodT - внешняя переменная, период Bollinger Bands.

MomentumPeriodT - период моментума, соответственно.

BandOBottom=iBands (NULL,0,BandOPeriodT,1,0,iMomentum(NULL,0,MomentumPeriodT,PRICE_OPEN,0),MODE_LOWER,0);

и еще вот так:

MomO=iMomentum(NULL,0,MomentumPeriodT,PRICE_OPEN,0); - внутренняя переменная, возвращающая значение momentum

BandOBottom=iBands (NULL,0,BandOPeriodT,1,0, MomO,MODE_LOWER,0); - значение переменной должно вернуть значение нижней линии Боллинджера для значения предыдущей переменной.

И еще, я правильно понимаю, что MODE_LOWER означает, что я получаю в переменной значение НИЖНЕЙ линии Боллинджера? Если нет, то как получить именно его?

 
Ovari:

Подскажите пожалуйста, как в советнике использовать bollinger bands построенный не для значений цены, а для значений momentum? я попробовал вот так:

BandOPeriodT - внешняя переменная, период Bollinger Bands.

MomentumPeriodT - период моментума, соответственно.

BandOBottom=iBands (NULL,0,BandOPeriodT,1,0,iMomentum(NULL,0,MomentumPeriodT,PRICE_OPEN,0),MODE_LOWER,0);

и еще вот так:

MomO=iMomentum(NULL,0,MomentumPeriodT,PRICE_OPEN,0); - внутренняя переменная, возвращающая значение momentum

BandOBottom=iBands (NULL,0,BandOPeriodT,1,0, MomO,MODE_LOWER,0); - значение переменной должно вернуть значение нижней линии Боллинджера для значения предыдущей переменной.

И еще, я правильно понимаю, что MODE_LOWER означает, что я получаю в переменной значение НИЖНЕЙ линии Боллинджера? Если нет, то как получить именно его?


Смотри прицеп - там Bands для RSI - у себя - делайте все аналогично только уже для Momentum.

Описание - в журнале - см. код в начале.

Файлы:
 
Спасибо, а то я очень очень новичек, да и не особо программист:)
 

Здрасьте! Прошу помощи! Хочу попробовать индикатор РVТ:

double PVT = iCustom(NULL,240,"PVT",PRICE_CLOSE,1,1)

Подскажите, пожалуйста, что не хватает?

В логи строчит: 2012.05.14 19:34:46 Cannot open file 'C:\Program Files\Alpari NZ MT4\experts\indicators\PVT.ex4' on the EURUSD,H4

Спасибо!

 
mahla:

куда дописать трейлин стоп и безубыточный вывод ? и что то не увеличивает лот при увилечении депозита

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int Buy (int StopLoss = 0, int TakeProfit = 0, double Lot = 0)

{

int Ticket = 0;

double SL = 0;

double TP = 0;

double VolumeLot = 0;

RefreshRates();

if (StopLoss != 0)

SL = NormalizeDouble(Bid-StopLoss*Point, Digits);

if (TakeProfit != 0)

TP = NormalizeDouble(Ask+TakeProfit*Point, Digits);

if (Lot == 0)

VolumeLot = GetLot ();

else

VolumeLot = Lot;

Ticket = OrderSend(Symbol(), OP_BUY, VolumeLot, NormalizeDouble(Ask, Digits), 20, SL, TP, NULL, AccountNumber(), 0, Green);

if (Ticket == -1)

{

return (GetLastError ());

}

else

{

return (Ticket);

}

}

int Sell (int StopLoss = 0, int TakeProfit = 0, double Lot = 0)

{

int Ticket = 0;

double SL = 0;

double TP = 0;

double VolumeLot = 0;

RefreshRates();

if (StopLoss != 0)

SL = NormalizeDouble(Ask+StopLoss*Point, Digits);

if (TakeProfit != 0)

TP = NormalizeDouble(Bid-TakeProfit*Point, Digits);

if (Lot == 0)

VolumeLot = GetLot ();

else

VolumeLot = Lot;

Ticket = OrderSend(Symbol(), OP_SELL, VolumeLot, NormalizeDouble(Bid, Digits), 20, SL, TP, NULL, AccountNumber(), 0, Red);

if (Ticket == -1)

return (GetLastError ());

else

return (Ticket);

}

double GetLot ()

{

int lot;

if (AccountBalance()>=300) lot=0.01;

if (AccountBalance()>=500) lot=0.02;

if (AccountBalance()>=800) lot=0.03;

return (lot);

}

Будем полагать, что открытая позиция уже выбрана и мы точно знаем, что эта позиция открыта
по инструменту, к которому прикреплен эксперт. Также предположим, что значение трейлинг стопа
в пипсах содержится в переменной TrailingStop.

   int err;
   if (OrderType() == OP_BUY)
     {
       // позиция на покупку
       if ((Bid-OrderOpenPrice())>=(TrailingStop*Point))
         {
           // выставляем Stop Loss
           if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid-TrailingStop*Point,
                                    OrderTakeProfit(), 0))
             Print("#", OrderTicket(),": trailing stop ", Bid-TrailingStop*Point);
           else
             {
              err = GetLastError();
              Print("#", OrderTicket(),": trailing stop error ", err);
             }
         }
     }
   else
     {
       // позиция на продажу
       if ((OrderOpenPrice()-Ask)>=(TrailingStop*Point))
         {
           // выставляем Stop Loss
           if (OrderModify(OrderTicket(), OrderOpenPrice(), Ask+TrailingStop*Point,
                                    OrderTakeProfit(), 0))
             Print("#", OrderTicket(),": trailing stop ", Ask+TrailingStop*Point);
           else
             {
              err = GetLastError();
              Print("#", OrderTicket(),": trailing stop error ", err);
             }
         }
     }
Функция OrderProfit() возвращает прибыль для ордера, выделенного с помощью функции OrderSelect().

Предположим, что мы хотим подсчитать прибыль, которую мы получили по закрытым позициям.

   int profit = 0;
   int pos;
   for ( pos = 0; pos<HistoryTotal(); pos++ )
     {
       // выделим позицию
       if (OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY) == true)
         {
           // это не отложенный ордер?
           if ( OrderType() <= OP_SELL) profit += OrderProfit();            
         }
       else
           Print("Ошибка ", GetLastError(), " при выделении ордера ", OrderTicket());
     }
   Print("Суммарный профит по закрытым позициям = ", profit);
А полный код, который подсчитывает прибыль по всем закрытым позициям,
которые открыты сегодня, будет таким:

   //---- вычислим начало дня - переменная day_start
   int c_time = CurTime();  
   datetime day_start;
   day_start=c_time-TimeHour(c_time)*60*60-TimeMinute(c_time)*60-TimeSeconds(c_time);
   //---- подсчитаем прибыль
   int profit = 0;
   int pos;
   for ( pos = 0; pos<HistoryTotal(); pos++ )
     {
       // выделим позицию
       if (OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY) == true)
         {
           // это не отложенный ордер?
           if ( OrderType() <= OP_SELL)
             {
               // ордер был открыт сегодня?
               if (OrderOpenTime()>=day_start) profit += OrderProfit();
             }
         }
       else
           Print("Ошибка ", GetLastError(), " при выделении ордера ", OrderTicket());
     }
   Print("Суммарный профит по закрытым позициям = ", profit);
 
mahla:

? и что то не увеличивает лот при увилечении депозита

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


Может в коде не хватает еще этого:

double OrderLots( )
Возвращает количество лотов для выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
Пример:
  if(OrderSelect(10,SELECT_BY_POS)==true)
    Print("lots for the order 10 ",OrderLots());
  else
    Print("OrderSelect() вернул ошибку - ",GetLastError());
 
borilunad:

Здрасьте! Прошу помощи! Хочу попробовать индикатор РVТ:

Подскажите, пожалуйста, что не хватает?

В логи строчит: 2012.05.14 19:34:46 Cannot open file 'C:\Program Files\Alpari NZ MT4\experts\indicators\PVT.ex4' on the EURUSD,H4

Спасибо!

Не хватает собственно индикатора PVT (вы уверены, что он у вас есть?).
 
alsu:
Не хватает собственно индикатора PVT (вы уверены, что он у вас есть?).

Конечно, есть и компилирован, и ех4. И на график поставил. Может я не то что-то написал? Спасибо!