Скачать MetaTrader 5

Мартин отказывается работать. В чем ошибка?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
uzer911
88
uzer911  

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

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  

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

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

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


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


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

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

khorosh
9044
khorosh  
Bicus >>:

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


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

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