форумчане подскажите пож, ищу советники для тестирования на основе одиночного мартина (простое удвоение лота после проиграша, не илан). Достаточно просто название. Если дадите ссылку - буду очень благодарен
Вера в мартины может дорого стоить)) При последовательном увеличении позиции после убытка понятие "риск" исчезает.
Рынок рано или поздно (на реале скорее рано) создаст условия для полного слива депозита.
Насчет простого удвоения лота после убытка - есть функция расчета лота, код ниже. Ее можно цеплять к любому советнику. Если условием входа указать отсутствие открытой сделки - будет чистый мартин. Тогда как выбирать купить или продать (чередовать или случайно).
Но если честно - все возможные комбинации условий и фильтров давно проверены - ошибок в рынке не найдено. Мартины сливают.
По ссылке удвоение лота применено к стандартному советнику на основе macd. В тестере работает неплохо)
http://www.invest74.ru/forex_laboratory/interesnye_martiny/msg1581/#msg1581Во вложении вариант входа по макд больше меньше 0.
double LotSize()
{
double lot = Lots;
double lot_min = MarketInfo(Symbol() , MODE_MINLOT );
double lot_max = MarketInfo( Symbol(), MODE_MAXLOT );
double lot_step = MarketInfo( Symbol(), MODE_LOTSTEP );
double lastLot = 0.0;
if ( AfterStopLoss_Koeff > 0.0 ) lastLot = lastLossLot();
if ( lastLot < 0.0001 )
{
int lot_size = MarketInfo( Symbol(), MODE_LOTSIZE );
double balance = AccountBalance();
int leverage = AccountLeverage();
if ( MeansType == 2 ) balance = AccountEquity();
if ( MeansType == 3 ) balance = AccountFreeMargin();
if ( lot_min < 0 || lot_max <= 0.0 || lot_step <= 0.0 || lot_size <= 0 )
{
Print( "LotSize: invalid MarketInfo() results [" + lot_min + "," + lot_max + "," + lot_step + "," + lot_size + "]" );
return(-1);
}
if ( leverage <= 0 )
{
Print( "LotSize: invalid AccountLeverage() [" + leverage + "]" );
return(-1);
}
if ( MeansType > 0 ) lot = balance * Риск*0.01 * leverage / lot_size;
}
else
{
lot = MathCeil( lastLot * AfterStopLoss_Koeff / lot_step ) * lot_step;
}
lot = NormalizeDouble( lot / lot_step, 0 ) * lot_step;
if ( lot < lot_min ) lot = lot_min;
if ( lot > lot_max ) lot = lot_max;
if ( AccountFreeMarginCheck( Symbol(), OP_BUY, lot ) < 10 || GetLastError() == 134 )
{
Alert( "Недостаточно свободных средств для открытия позиции размером ", DoubleToStr( lot, 2 ), " lots!" );
last_trade = Time[0];
return(-1);
}
return(lot);
}
double lastLossLot()
{
int total = OrdersHistoryTotal(), last_op = 0; double last_profit = 0.0, last_lot = 0.0;
for ( int z = total-1; z >= 0; z -- )
{
if ( !OrderSelect( z, SELECT_BY_POS, MODE_HISTORY ) )
{
int _GetLastError = GetLastError();
// Print( "OrderSelect( ", z, ", SELECT_BY_POS, MODE_HISTORY ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
continue;
}
if ( OrderSymbol() != Symbol() ) continue;
// if ( OrderMagicNumber() != _MagicNumber ) continue;
if ( OrderOpenTime() > last_op )
{
last_op = OrderOpenTime();
last_profit = OrderProfit();
last_lot = OrderLots();
}
}
if ( last_profit > 0.0 )
return(0.0);
else
return(last_lot);
}