Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Проявляй активность в сообществе. Увеличивай ленту достижений!
uzer911
88
uzer911 2010.05.07 21:12 

Написал дублер отложенных ордеров, нашел маленький код мартина (без перебора истории). Но вот проблемма: не увеличивает размер лота при убытке. Кто видит ошибку
Этот же код Мартина на обычном Дублере (два разнонаправленных ордера) работает без проблем.

extern int              MAGIC     = 777;
extern int              StopLoss        = 30;   // расстояние до СтопЛосса в пунктах.
extern int              TakeProfit      = 100;   // расстояние до ТейкПрофита в пунктах.
extern int              Step            = 20;   // расстояние до уровня установки отложенного ордера.
double Ballance=0.0;
double Lot, lots;

int start()
{ //---- Переменные, в которые будем запоминать тикеты ордеров каждого типа
int BuyStopOrder, SellStopOrder, BuyOrder, SellOrder, ticket = 0;
int _GetLastError = 0, _OrdersTotal = OrdersTotal();
double _OpenPriceLevel, _StopLossLevel, _TakeProfitLevel;
double _Point=0.00001;
double Lot = NextLot();
//---- перебираем все открытые позиции и запоминаем, позиции какого типа уже открыты:
        for ( int z = _OrdersTotal - 1; z >= 0; z -- )
        {
//---- если при выборе позиции возникла ошибка, переходим к следующей
                if ( !OrderSelect( z, SELECT_BY_POS ) )
                {  _GetLastError = GetLastError();
                        Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError );
                        continue;       }
//---- если позиция не наша, пропускаем её
                if ( OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC )
                {
//---- в зависимости от типа позиции, меняем значение переменной:
                  switch ( OrderType() )
                  {case OP_BUY:         BuyOrder                        = OrderTicket(); break;
                        case OP_SELL:           SellOrder               = OrderTicket(); break;
                        case OP_BUYSTOP:        BuyStopOrder    = OrderTicket(); break;
                        case OP_SELLSTOP:       SellStopOrder   = OrderTicket(); break;
        } } } 
//---- Если у нас есть оба отложенных ордера - выходим, 
//---- надо подождать, пока один из них сработает
if ( BuyStopOrder > 0 && SellStopOrder > 0 ) return(0);
//---- перебираем все открытые позиции во второй раз - теперь мы будем с ними работать:
        _OrdersTotal = OrdersTotal();
        for ( z = _OrdersTotal - 1; z >= 0; z -- )
        {
//---- если при выборе позиции возникла ошибка, переходим к следующей
                if ( !OrderSelect( z, SELECT_BY_POS ) )
                {       _GetLastError = GetLastError();
                        Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError );
                        continue;       }
//---- если позиция открыта не по текущему инструменту, пропускаем её
                if ( OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC ) 
                {
//---- в зависимости от типа позиции, меняем значение переменной:
                  switch ( OrderType() )
                  {
//---- если есть открытая бай-позиция,
                        case OP_BUY:
                        {
//---- если селл-стоп ордер ещё не удалён, удаляем его:
                                if ( SellStopOrder > 0 )
                                {       if ( !OrderDelete( SellStopOrder ) )
                                        {       Alert( "OrderDelete Error #", GetLastError() );
                                                return(-1);
                                }       }
//---- если есть открытая позиция, выходим - дальше делать нечего
                        break;
                           return(0);   }
//---- если есть открытая селл-позиция,
                        case OP_SELL:
                        {       if ( BuyStopOrder > 0 )
                                {       if ( !OrderDelete( BuyStopOrder ) )
                                        {       Alert( "OrderDelete Error #", GetLastError() );
                                                return(-1);
                                }       }
                                break;
                                return(0); }
          }}} 
//+------------------------------------------------------------------+
//| Если выполнение дошло до этого места, значит отложенных ордеров и открытых позиций нет
//+------------------------------------------------------------------+
//---- Устанавливаем бай-стоп ордер:
        lots=NextLot();
        _OpenPriceLevel = NormalizeDouble( Ask + Step*_Point, Digits );
        _StopLossLevel = NormalizeDouble( _OpenPriceLevel - StopLoss*_Point, Digits );
   _TakeProfitLevel = NormalizeDouble( _OpenPriceLevel + TakeProfit*_Point, Digits );
   ticket = OrderSend ( Symbol(), OP_BUYSTOP, lots, _OpenPriceLevel, 3, _StopLossLevel, 
                                        _TakeProfitLevel, "", MAGIC,0,Green );
        if ( ticket < 0 )
        {       Alert( "OrderSend Error #", GetLastError() );
                return(-1);     }
//---- Устанавливаем селл-стоп ордер: 
        _OpenPriceLevel = NormalizeDouble( Bid - Step*_Point, Digits );
   _StopLossLevel = NormalizeDouble( _OpenPriceLevel + StopLoss*_Point, Digits );
   _TakeProfitLevel = NormalizeDouble( _OpenPriceLevel - TakeProfit*_Point, Digits );
        ticket = OrderSend ( Symbol(), OP_SELLSTOP, lots, _OpenPriceLevel, 3, _StopLossLevel, 
                                   _TakeProfitLevel, "", MAGIC,0,Red );
        if ( ticket < 0 )
        {       Alert( "OrderSend Error #", GetLastError() );
                return(-1);     }
return(0); }
//+------------------------------------------------------------------+
//| Мартингейл
//+------------------------------------------------------------------+
double NextLot() 
{  
double _MINLOT = MarketInfo(Symbol(),MODE_MINLOT); //Минимально допустимый лот. 
double LotMax  = MarketInfo(Symbol(),MODE_MAXLOT); //Максимально допустимый лот. 
    if (Ballance>AccountBalance())
    Lot=2*Lot;
    else
    Lot=_MINLOT;
Ballance=AccountBalance();
if (Lot>LotMax) Lot=LotMax;       
return(Lot);
}
richie
3171
richie 2010.05.07 21:14  

На Альпари работаете? Если не ошибаюсь, там стопы не меньше 50 пунктов.
extern int StopLoss = 30;

Alexander
2441
Alexander 2010.05.07 21:52  
Мне кажется, что раз Вы вычисляете лот на каждом тике, независимо от условий, то превый раз после проигрыша советник установит лот=2, но сразу же следующим тиком вернет в единицу.
uzer911
88
uzer911 2010.05.07 22:15  
Richie писал(а) >>

На Альпари работаете? Если не ошибаюсь, там стопы не меньше 50 пунктов.
extern int StopLoss = 30;


сейчас на Альпари сделали минимальное расстояние от рынка у каждой валюты разное (например евро/доллар 18 п.)
Bicus
2395
Bicus 2010.05.08 04:31  
Metathron >>:


сейчас на Альпари сделали минимальное расстояние от рынка у каждой валюты разное (например евро/доллар 18 п.)

Как я понял мин. размер стоп-лосса еще может зависеть и от волатильности. Когда сильное движение хрен установишь стоп-лосс ближе, чем 30 пунктов, на eurusd по крайней мере.

khorosh
8041
khorosh 2010.05.08 05:51  
Bicus >>:

Как я понял мин. размер стоп-лосса еще может зависеть и от волатильности. Когда сильное движение хрен установишь стоп-лосс ближе, чем 30 пунктов, на eurusd по крайней мере.


Если точнее, то от величины стоплевеля.

timbo
3139
timbo 2010.05.08 09:49  
Мартин отказывается работать? Может ему совесть не позволяет?
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий