Diablo - страница 12

 

Сделал советника выставляет ордера как в авторской методики, но есть отличия. Выставляет по уровням в зависимости от ATR (если методика беспроигрышная, то какая разница от каких уровней выставлять). С началом нового дня закрывает и удаляет все ордера (просто я не знаю как еще закрыть ордера, которые без ТП и СЛ и которые не принесут прибыли).

Можете попробовать оптимизировать параметры. Мне просто лень, не верю я в эту стратегию.

Файлы:
 
khorosh:
Когда аргументированно критиковать лень, а сказать что-нибудь очень хочется, то лучше промолчать, а не заниматься калом.
В зеркало не забудьте посмотреть.
 

Diablo v09.02.12 (Immortal Version)

На некотором расстоянии от цены через одинаковый промежуток выставляются ордера двух типов: прямые (Buy Stop вверх от цены и Sell Stop вниз от цены) и перевернутые (Sell Limit вверх от цены и Buy Limit вниз от цены). Ордера Buy Stop и Sell Limit ставятся на одинаковых уровнях (попарно), как и ордера Sell Stop и Buy Limit.

Все ордера имеют одинаковый объем и Stop Loss равный шагу между ордерами.

У прямых (Buy Stop и Sell Stop) ордеров нет Take Profit. У перевернутых (Sell Limit и Buy Limit) ордеров Take Profit нарастающий арифметически: у первого (ближайшего к цене) ордера равен одному шагу между ордерами, у второго (чуть более удаленного) - трем шагам, у третьего - пяти и так далее.


Скрипт для выставления ордеров:

// Diablo v09.02.12
#property copyright "Jon Katana"
#property show_inputs
extern int Step=0,Spread=0,Levels=0;
extern double Up=0,Vol=0;
int start()
{for(int i=0;i<(Levels);i++)
{OrderSend(Symbol(),OP_BUYSTOP,Vol,Up+(i*Step+Spread)*Point,0,Up+(i-1)*Step*Point,0,0,0);
OrderSend(Symbol(),OP_SELLSTOP,Vol,Up-(i+1)*Step*Point,0,Up-(i*Step-Spread)*Point,0,0,0);
OrderSend(Symbol(),OP_SELLLIMIT,Vol,Up+i*Step*Point,0,Up+((i+1)*Step+Spread)*Point,Up-(Step*(i+1)+Spread)*Point,0,0);
OrderSend(Symbol(),OP_BUYLIMIT,Vol,Up-((i+1)*Step-Spread)*Point,0,Up-(i+2)*Step*Point,Up+i*Step*Point,0,0);}
return(0);}

Система полностью неубиваемая. Предоставленная сама себе, в итоге всегда закрывается с прибылью или в нуле.

Очень хорош тренд без откатов на размер шага - прибыль нарастает как снежный ком, позволяя собрать одно движение цены несколько раз. На флете заработок умеренный, либо выходит в ноль. Самый медленный вариант - паттерн "дракон", когда цена движется в одну сторону, но откатывает от каждого уровня назад на один шаг, после чего идет дальше. В этом случае потребуется просто чуть больше времени на выход в прибыль или ноль.

Исходя из этого, шаг между уровнями для выставления ордеров выбирайте из такого расчета, чтобы цена не цепляла уже пройденные уровни мини-коррекциями.

Можно оставлять схему без присмотра, главное, чтобы цена не вышла за пределы уровней, на которых стоят ордера. Другой вариант - слежение за Diablo и закрытие по достижении некоторой прибыли (например, размером в один шаг) с последующей перестановкой ордеров заново, либо просто однократное закрытие с прибылью.

 

Поправка в скрипте: было не туда смещение на спред в ордерах Sell Limit:

// Diablo v13.02.12
#property copyright "Jon Katana"
#property show_inputs
extern int Step=0,Spread=0,Levels=0;
extern double Up=0,Vol=0;
int start()
{for(int i=0;i<(Levels);i++)
{OrderSend(Symbol(),OP_BUYSTOP,Vol,Up+(i*Step+Spread)*Point,0,Up+(i-1)*Step*Point,0,0,0);
OrderSend(Symbol(),OP_SELLSTOP,Vol,Up-(i+1)*Step*Point,0,Up-(i*Step-Spread)*Point,0,0,0);
OrderSend(Symbol(),OP_SELLLIMIT,Vol,Up+i*Step*Point,0,Up+((i+1)*Step+Spread)*Point,Up-(Step*(i+1)-Spread)*Point,0,0);
OrderSend(Symbol(),OP_BUYLIMIT,Vol,Up-((i+1)*Step-Spread)*Point,0,Up-(i+2)*Step*Point,Up+i*Step*Point,0,0);}
return(0);}
 

extern int Step=0,Spread=0,Levels=0;
extern double Up=0,Vol=0

какие тут параметры вписать чтоб заработало?

 
Почему переменную UP не присвоить аск, получитсья что ордера будут выставляться от текущей цены....
 
#property copyright "Jon Katana"
#property show_inputs
extern int Step=50,Spread=2,Levels=5;
extern double Up=0,Vol=0.1;
int TotalOrders,i;
int start()
{Up=Ask;
        TotalOrders=OrdersTotal();
        for (i=0; i<=TotalOrders; i++){
                 if (OrderSelect(0,SELECT_BY_POS)==true){
                    if (OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,5,Red);
                    if (OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,5,Red);
                    if (OrderType()==OP_SELLSTOP) OrderDelete(OrderTicket(),Green);
                    if (OrderType()==OP_BUYSTOP) OrderDelete(OrderTicket(),Green);
                    if (OrderType()==OP_SELLLIMIT) OrderDelete(OrderTicket(),Green);
                    if (OrderType()==OP_BUYLIMIT) OrderDelete(OrderTicket(),Green);
                 
                 }
        }

for(int i=0;i<(Levels);i++)
{OrderSend(Symbol(),OP_BUYSTOP,Vol,Up+(i*Step+Spread)*Point,0,Up+(i-1)*Step*Point,0,0,0);
OrderSend(Symbol(),OP_SELLSTOP,Vol,Up-(i+1)*Step*Point,0,Up-(i*Step-Spread)*Point,0,0,0);
OrderSend(Symbol(),OP_SELLLIMIT,Vol,Up+i*Step*Point,0,Up+((i+1)*Step+Spread)*Point,Up-(Step*(i+1)-Spread)*Point,0,0);
OrderSend(Symbol(),OP_BUYLIMIT,Vol,Up-((i+1)*Step-Spread)*Point,0,Up-(i+2)*Step*Point,Up+i*Step*Point,0,0);}
return(0);
}
Добавил в скрипт очищение. Тоесть если есть открытые или отложенники, он сначала всё удаляет, а потом раставляет отложки в соотвествии с параметрами...
 
IronBird:

extern int Step=0,Spread=0,Levels=0;
extern double Up=0,Vol=0

какие тут параметры вписать чтоб заработало?

Step - шаг между ордерами в пунктах (например, 20 для четырехзнака или 200 для пятизнака);

Spread - спред в пунктах (например 2 для четырехзнака или 20 для пятизнака);

Levels - количество уровней, на которых будут выставлены ордера (например 20);

Up - линия НАД ценой, с которой начнется выставление ордеров вверх (вниз ордера будут выставляться автоматически с отступом в Step от этой линии);

Vol - объем ордеров (например 0.1).

 
nikelodeon:
Почему переменную UP не присвоить аск, получитсья что ордера будут выставляться от текущей цены....

По двум причинам:

1) Нельзя ставить ордера начиная с определенного уровня (сопротивления, поддержки, Фибоначчи, Rabbit...)

2) Ордеров ставится несколько десятков и выставляются они не мгновенно. За это время Ask может сместиться от начального значения, что непредсказуемо сдвинет места установки ордеров и их Take Profit со Stop Loss. Это позволит дилинговому центру открывать ордера на уровнях не парой, а "выдергивать" отдельные ордера, не цепляя второй ордер из пары и потом загонять их в убыток, что рушит всю систему.

 
JonKatana:

По двум причинам:

1) Нельзя ставить ордера начиная с определенного уровня (сопротивления, поддержки, Фибоначчи, Rabbit...)

2) Ордеров ставится несколько десятков и выставляются они не мгновенно. За это время Ask может сместиться от начального значения, что непредсказуемо сдвинет места установки ордеров и их Take Profit со Stop Loss. Это позволит дилинговому центру открывать ордера на уровнях не парой, а "выдергивать" отдельные ордера, не цепляя второй ордер из пары и потом загонять их в убыток, что рушит всю систему.

Можно первые два ордера установить с использованием текущей цены, а цены остальных вычислять относительно цены первых ордеров. Причём первые два ордера могут быть рыночными.