Код AFL Amibroker Покупка Статус продажи не получает, если условие - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть AFL, который работает нормально для сырой нефти. из 10 сделок 8 сделок являются целями. У меня есть код для размещения заказов на автоматические торги. Код автоматической торговли работает нормально с другими кодами AFL, но проблема в следующем алгоритме: логическое значение BUY и SELL не соответствует условию IF. Но IIF (купить .... условия работают нормально.

Мой главный вопрос: почему BUY Sell True или false не работает в последнем статусе в AFL. Пожалуйста, помогите мне решить эту проблему.

_SECTION_BEGIN("T+4 day ");
Title = " ..:: duy ::.. - Filter of Stock " + " " + FullName() + " " + Date( ) ;
// 4-Day-Range Switch
prev=AMA2(C,1,0);
d=IIf(C>Ref(Max(Max(H,Ref(H,-20)),Max(Ref(H,-10),Ref(H,-15))),-1),Min(Min(L,Ref(L,-20)),Min(Ref(L,-10),Ref(L,-15))),
IIf(C<Ref(Min(Min(L,Ref(L,-20)),Min(Ref(L,-10),Ref(L,-15))),-1),Max(Max(H,Ref(H,-20)),Max(Ref(H,-10),Ref(H,-15))),PREV));
a=Cross(Close,d);
b=Cross(d,Close);
state=IIf(BarsSince(a)<BarsSince(b),1,0);
s=state>Ref(state,-1);
ss=state<Ref(state,-1);
sss=state==Ref(state,-1);
col=IIf(state == 1 ,51,IIf(state ==0,4,1));
Plot(C,"",Col,128);

Buy=s;
Sell=ss;


PlotShapes( shapeUpArrow * s ,6,0,L);
PlotShapes( shapeDownArrow *ss ,4,0,H);


dist = 0.8*ATR(10);
dist1 = 2*ATR(10);
for( i = 0; i < BarCount; i++ )
{
    if( Buy )
    {
        PlotText( "\nBuy:" + L[ i ] + "\nT= " + (L*1.005) + "\nSL= " + (L*0.9975), i, L[ i ]-dist, colorGreen, colorWhite );
    }
    if( Sell )
    {
        PlotText( "Sell:" + H[ i ] + "\nT= " + (H*0.995) + "\nSL= " + (H*1.0025), i, H[ i ]+dist1, colorRed, colorWhite );
    }
}

Buy = ExRem(Buy,Sell);
Sell = ExRem(Sell,Buy);

if ( LastValue(Buy)==1)
{
    quantity=2;
    orderId=placeOrderFuture("MCX", "FUTCOM", ChartSymbol, "BUY", "INTRADAY", "MARKET", quantity, 0, defaultTriggerPrice(), "19-APR-2018", defaultStrategyId(), defaultComments());
    //orderId = placeOrderUsingParams(tradeType, AT_ORDER_TYPE, AT_QUANTITY, buyPrice, defaultTriggerPrice(), 1);
}

if ( LastValue(Sell) == 1 )
{
    quantity=2;
    orderId=placeOrderFuture("MCX", "FUTCOM", ChartSymbol, "SELL", "INTRADAY", "MARKET", quantity, 0, defaultTriggerPrice(), "19-APR-2018", defaultStrategyId(), defaultComments());
    //orderId = placeOrderUsingParams("SELL", AT_ORDER_TYPE, AT_QUANTITY, sellPrice, defaultTriggerPrice(), 1);
}

1 Ответ

0 голосов
/ 14 августа 2018

LastValue документация

С помощью операторов if вам нужно указать конкретный бар. И согласно документации, LastValue может заглянуть в будущее. Я не могу точно сказать, что происходит с вашим кодом, но циклы / if / switch могут быть хитрыми. Этот урок Циклы в Amibroker может дать вам некоторое представление о том, как они работают.

Вместо этого вы можете попробовать SelectedValue. Если вы не выбрали ни одного бара, по умолчанию автоматически отображается последний бар. Я использую это для своей торговли в реальном времени.

bi = SelectedValue(BarIndex());

if(Buy[bi])
{
    ...
}

На несвязанной ноте ваши текстовые графики не будут отображать нефильтрованные сигналы, поместите код ExRem в исходные условия покупки и продажи.

...