Marcello
Зарегистрирован: 30.05.2015
Сообщения: 69
|
Приветствую!
Есть простая системка на дневках.
EMA50 по хаям, EMA15 по клоузу. MACD( 35, 70), "сигнал" от MACD 12, ATR200, умноженный на параметр (далее по тексту просто ATR).
Свеча-триггер входа в лонг: EMA15 выше EMA50, лоу свечи ниже EMA15, клоуз свечи выше EMA15, MACD выше "сигнала". Вход на пробое хая триггера + отступ частью ATR. Важно, чтоб хай триггера был не выше ATR от EMA15. Стоп 2 * ATR. Первая цель ATR, вторая цель 2 * ATR. Когда дошло до первой цели, перевод в б/у. Фикс либо по стопу, либо по второй цели. Шорт не рассматриваем, но по сути также, только наоборот.
Закодить по-правильному (без циклов) не получается, да и циклы мне ближе. На картинке все красиво и понятно, а тестер выдает всего 1-2 сделки, хотя "стрелок" явно больше.
Вот цикл.
Код: |
Mult = Param( "Mult", 5, 1, 50, 1 ) / 10;
Plot(C, "Price", colorDefault, styleBar);
EH = EMA( H, 50 );
EL = EMA( L, 50 );
E15 = WMA( C, 15 );
M = MACD( 35, 70 );
S = Signal( 35, 70, 12 );
A = EMA( ATR(1), 200 ) * Mult;
Plot( EH, "EH", colorDefault );
Plot( EL, "EL", colorDefault );
Plot( E15, "E15", colorYellow );
pos = 0;
Buy = Sell = 0;
ePrice = sPrice = pPrice1 = pPrice2 = null;
// ePrice - уровень входа
// sPrice - стоплосс
// pPrice1, pPrice2 - цели
vBE = 0; // признак того, что переведено в б/у
eBar = 0; // бар входа
for ( i = 200; i < BarCount; i++ ) {
pPrice1[i] = pPrice1[i-1];
pPrice2[i] = pPrice2[i-1];
sPrice[i] = sPrice[i-1];
ePrice[i] = ePrice[i-1];
if ( pos == 0 )
if ( ePrice[i] > 0 )
if ( H[i] >= ePrice[i] ) {
Buy[i] = 1;
BuyPrice[i] = Max( O[i], ePrice[i] );
ePrice[i] = BuyPrice[i];
sPrice[i] = ePrice[i] - A[i-1] * 2;
pPrice1[i] = ePrice[i] + A[i-1];
pPrice2[i] = ePrice[i] + A[i-1] * 2;
sPrice[i-1] = sPrice[i]; // чтоб увидеть уровни короче 1 бара
pPrice1[i-1] = pPrice1[i];
pPrice2[i-1] = pPrice2[i];
pos = 1;
vBE = 0;
eBar = i;
}
if ( pos == 1 )
if ( i != eBar )
if ( L[i] < sPrice[i] ) {
Sell[i] = 1;
SellPrice[i] = Min( O[i], sPrice[i] );
pPrice1[i] = Null;
pPrice2[i] = Null;
sPrice[i] = Null;
ePrice[i] = null;
pos = 0;
}
if ( pos == 1 )
if ( vBE == 0 )
if ( H[i] > pPrice1[i] ) {
sPrice[i] = ePrice[i] * 1.002; // перевод в б/у с учетом комиссии
vBE = 1;
}
if ( pos == 1 )
if ( H[i] > pPrice2[i] ) {
Sell[i] = 1;
SellPrice[i] = Max( O[i], pPrice2[i] );
pPrice1[i] = Null;
pPrice2[i] = Null;
sPrice[i] = Null;
ePrice[i] = null;
pos = 0;
}
if ( pos == 1 )
if ( vBE == 1 )
if ( C[i] < sPrice[i] ) {
Sell[i] = 1;
SellPrice[i] = C[i];
pPrice1[i] = Null;
pPrice2[i] = Null;
sPrice[i] = Null;
ePrice[i] = null;
pos = 0;
}
if ( pos == 0 )
if ( E15[i] > EH[i] )
if ( L[i] < E15[i] )
if ( C[i] > E15[i] )
if ( H[i] < E15[i] + A[i] )
if ( M[i] > S[i] ) ePrice[i] = H[i] + A[i] / 5;
if ( pos == 0 )
if ( ePrice[i] > 0 )
if ( C[i] < E15[i] ) ePrice[i] = null;
}
Plot( pPrice1, "P1", colorYellow );
Plot( pPrice2, "P2", colorBrightGreen );
Plot( sPrice, "S", colorRed );
Plot( ePrice, "E", colorTurquoise );
PlotShapes( Buy * shapeUpArrow, colorBrightGreen, 0, BuyPrice, 0 );
PlotShapes( Sell * shapeDownArrow, colorRed, 0, SellPrice, 0 );
|
Что не так в этом цикле? AmiBroker 5.90 (32-bit), Win10 (вдруг важно). |
|
|