в чем причина?

 

есть две линии

стратегия следующая - пересечение вверх-покупку, вниз - продажа. рассмотрев показатели - очень много убыточных сделок во флете

решил рассмотреть возможможность: после пересечения линий цена опускается на линию с большим периодом, покупаем, ставим ордер на покупку\продажу.

решил это сделать спомощью флагов вверх\вниз,

однако не получилось

int start()
{
double Lts=MarketInfo(Symb,MODE_MINLOT);// Мин. размер лота
Alert ("минилот", Lts);
RefreshRates(); // Обновление данных
Symb=Symbol();
SMA_1_1=SMA_1_0; // значение МА_1 1 бара
SMA_2_1=SMA_2_0; // значение МА_2 1 бара
SMA_1_0=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,1); // МА_1 0 бар
SMA_2_0=iMA(NULL,0,Period_MA_2,0,MODE_LWMA,PRICE_TYPICAL,1); // МА_2 О бар

//----
if (SMA_1_0 > SMA_2_0 && SMA_1_1 < SMA_2_1) // Проверка пересечения вверх
{

ClosePositions(); // если есть ордер - убираем

A=1; //флаг вверх
B=0; //флаг вниз
}
if (A == 1 && SMA_2_0 + 10*Point == Bid)

{
SL=Bid - StopLoss*Point; // Вычисление SL откр.
TP=Bid + TakeProfit*Point; // Вычисление TP откр.
Alert("Попытка открыть Buy. Ожидание ответа..");

OpenPosition(Symbol(), OP_BUY, Lts, SL, TP);

if (Ticket > 0) // Получилось :)
{
Alert ("Открыт ордер Buy ",Ticket);
A=0;
B=0;
return;
}
}
//--------------------------------------------------------------------
if (SMA_1_0 < SMA_2_0 && SMA_1_1 > SMA_2_1) // Проверка пересечения вниз
{

ClosePositions();

A=0; //флаг вверх
B=1; //флаг вниз
}
if (B == 1 && SMA_2_0 + 10*Point == Ask) // флаг вниз, если цена опустилась до линии SMA
{
SL=Ask + StopLoss*Point; // Вычисление SL откр.
TP=Ask - TakeProfit*Point; // Вычисление TP откр.
Alert("Попытка открыть Sell. Ожидание ответа..");
OpenPosition(Symbol(), OP_SELL, Lts, SL, TP);
if (Ticket > 0) // Получилось :)
{
Alert ("Открыт ордер Sell ",Ticket);
A=0;
B=0;
return; // Выход из start()
}
}
//---------
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+

//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, https://www.mql5.com/go?link=http://www.kimiv.ru// |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Закрытие позиций по рыночной цене |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sSymbol - наименование инструмента ("" - любой символ, |
//| NULL - текущий символ) |
//| iOperation - операция (-1 - любая позиция) |
//| iMagic - MagicNumber (-1 - любой магик) |
//+----------------------------------------------------------------------------+

void ClosePositions(string sSymbol = "", int iOperation = -1, int iMagic = -1) {
int i, k = OrdersTotal();

//if (sSymbol == "0") sSymbol = Symbol();
for (i = k - 1; i >= 0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol() == sSymbol || sSymbol == "") && (iOperation < 0 || OrderType() == iOperation)) {
if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
if (iMagic < 0 || OrderMagicNumber() == iMagic) ClosePosBySelect();
}
}
}
}
}

//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, https://www.mql5.com/go?link=http://www.kimiv.ru// |
//+----------------------------------------------------------------------------+
//| Версия : 13.06.2007 |
//| Описание: Закрытие одной предварительно выбранной позиции |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
double pp;

if (OrderType()==OP_BUY) {
pp=MarketInfo(OrderSymbol(), MODE_BID);
OrderClose(OrderTicket(), OrderLots(), pp, Slippage);
}
if (OrderType()==OP_SELL) {
pp=MarketInfo(OrderSymbol(), MODE_ASK);
OrderClose(OrderTicket(), OrderLots(), pp, Slippage);
}
}

//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, https://www.mql5.com/go?link=http://www.kimiv.ru// |
//+----------------------------------------------------------------------------+
//| Версия : 13.06.2007 |
//| Описание : Открытие позиции. Версия функции для тестов на истории. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" - текущий символ) |
//| op - операция |
//| ll - лот |
//| sl - уровень стоп |
//| tp - уровень тейк |
//| mn - MagicNumber |
//+----------------------------------------------------------------------------+
void OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0) {
double pp;
int err, ticket;

if (sy=="") sy=Symbol();
if (op==OP_BUY) {
pp=MarketInfo(sy, MODE_ASK);
} else {
pp=MarketInfo(sy, MODE_BID);
}
ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, "", mn, 0);
if (ticket<0) {
err=GetLastError();
Print("Error(",err,") open ",GetNameOP(op),": ",ErrorDescription(err));
Print("Ask=",Ask," Bid=",Bid," sy=",sy," ll=",ll,
" pp=",pp," sl=",sl," tp=",tp," mn=",mn);
}
}

//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, https://www.mql5.com/go?link=http://www.kimiv.ru// |
//+----------------------------------------------------------------------------+
//| Версия : 01.09.2005 |
//| Описание : Возвращает наименование торговой операции |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| iOperation - идентификатор торговой операции |
//+----------------------------------------------------------------------------+

string GetNameOP(int iOperation) {
switch (iOperation) {
case OP_BUY: return ("Buy");
case OP_SELL: return ("Sell");
case OP_BUYLIMIT: return ("Buy Limit");
case OP_SELLLIMIT: return ("Sell Limit");
case OP_BUYSTOP: return ("Buy Stop");
case OP_SELLSTOP: return ("Sell Stop");
default: return ("Unknown Operation");
}
}

в чем причина?

Баров в истории 1512
Смоделировано тиков 1757147
Качество моделирования 90.00%
Ошибки рассогласования графиков 1 - ?
Начальный депозит 500.00
Чистая прибыль 0.00
Общая прибыль 0.00
Общий убыток 0.00
Прибыльность
Матожидание выигрыша 0.00
Абсолютная просадка 0.00
Максимальная просадка 0.00 (0.00%)
Относительная просадка 0.00% (0.00)
Всего сделок 0
Короткие позиции (% выигравших) 0 (0.00%)
Длинные позиции (% выигравших) 0 (0.00%)
Прибыльные сделки (% от всех) 0 (0.00%)
Убыточные сделки (% от всех) 0 (0.00%)
Самая большая
прибыльная сделка 0.00
убыточная сделка 0.00
Средняя
прибыльная сделка 0.00
убыточная сделка 0.00
Максимальное количество
непрерывных выигрышей (прибыль) 0 (0.00)
непрерывных проигрышей (убыток) 0 (0.00)
Максимальная
непрерывная прибыль (число выигрышей) 0.00 (0)
непрерывный убыток (число проигрышей) 0.00 (0)
Средний
непрерывный выигрыш 0
непрерывный проигрыш 0

 

Плохая идея требовать абсолютного тождества двух чисел типа double в строках:

if (A == 1 && SMA_2_0 + 10*Point == Bid) 
if (B == 1 && SMA_2_0 + 10*Point == Ask) // флаг вниз, если цена опустилась до линии SMA

Поэтому нет и не будет сделок.

Может лучше формализовать выражение: ... если цена дошла до линии SMA, или пересекла ее

Задача много раз решалась. Поиск поможет

 
Mislaid:

Плохая идея требовать абсолютного тождества двух чисел типа double в строках:

Поэтому нет и не будет сделок.

Может лучше формализовать выражение: ... если цена дошла до линии SMA, или пересекла ее

Задача много раз решалась. Поиск поможет


согласен,

согласно расчетам проведенными в таблице exel, цена опускается до второй линии SMA и можно ввойти в рынок "прибавив" к этой линии спред.

Причина обращения: