Jump to content
Vedikhin

Уроки по программированию экспертов для начинающих

Recommended Posts

vlad_malinov
Думаю перед отрисовкой нового бара надо сделать

b0[pos+1]=b0[pos+2];

где b0 буфер соответствующего индикатора.

Не понял.Что это решает?Замена значения предыдущим..

С приходом каждого нового бара в буфере накапливаются новые значения начиная с нулевого - 0,1,..N.Это не проблема.Нужно что бы отрисовывался только нулевой и только с фиксированным сдвигом вправо.

Установка SetIndexDrawBegin( 0,0) также не приводит к результату.


Рынок постоянен в переменах

Share this post


Link to post
Share on other sites
vlad_malinov

Для наглядности график после прихода нового бара.

post-22932-1404209465,0108_thumb.gif


Рынок постоянен в переменах

Share this post


Link to post
Share on other sites
tester2
Думаю перед отрисовкой нового бара надо сделать

b0[pos+1]=b0[pos+2];

где b0 буфер соответствующего индикатора.

Не понял.Что это решает?Замена значения предыдущим..

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

Именно в этом и проблема. Если в буфере есть ТОЛЬКО 0 бар, то остальные не отрисовываются. Они заполнены каким то значением, которое не отрисовывается. Поэтому с приходом нового бара все сдвигается и данные которые были в баре 0 попадают в бар 1. Поэтому их нужно стереть. Если бар 2 был пустой, то

b0[pos+1]=b0[pos+2]; это и делает.


Все познается в сравнении.

Share this post


Link to post
Share on other sites
vlad_malinov

Не всё так просто друг мой.Это гистограмма, она строится между ДВУМЯ буферами.И если я заполню один буфер нулями или EMPTY то гистограмма отрисуется от нуля графика ко второй переменной, которую изменять нельзя.

Это я пробовал.


Рынок постоянен в переменах

Share this post


Link to post
Share on other sites
tester2

Привел бы код индикатора, было бы понятнее.


Все познается в сравнении.

Share this post


Link to post
Share on other sites
vlad_malinov

Спасибо за участие.

Вопрос решен и снимается.


Рынок постоянен в переменах

Share this post


Link to post
Share on other sites
star100

Как можно восстановить значения переменных, которые потерялись из-за того, что вырубился инет, либо терминал, а эксперта приходится запускать заного с начальными параметрами?


Думай и богатей !

Share this post


Link to post
Share on other sites
AlterWest

В МТ3 в Custom indicators есть индикатор АМА. Подскажите какую встроенную функцию i....., можно использовать для создания эксперта?


Лучше упустить возможность, чем потерять деньги!

Share this post


Link to post
Share on other sites
Rosh
В МТ3 в Custom indicators есть индикатор АМА. Подскажите какую встроенную функцию i....., можно использовать для создания эксперта?

Для обращений к индикатору из эксперта используй iCustom().

Share this post


Link to post
Share on other sites
AlterWest
В МТ3 в Custom indicators есть индикатор АМА. Подскажите какую встроенную функцию i....., можно использовать для создания эксперта?

Для обращений к индикатору из эксперта используй iCustom().

 

Спасибо! Будем пробовать


Лучше упустить возможность, чем потерять деньги!

Share this post


Link to post
Share on other sites
Aquarius2000

Сорри, если вопрос уже поднимался:

 

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

Спасибо.

Share this post


Link to post
Share on other sites
Rosh

Можно получать эти значения и при тестировании и при работе советника он-лайн. На основании этих данных можно строить нужную логику.

Share this post


Link to post
Share on other sites
KimIV
Как можно восстановить значения переменных, которые потерялись из-за того, что вырубился инет, либо терминал, а эксперта приходится запускать заного с начальными параметрами?

Пиши в файл.

В начале работы системной функции START читаешь настройки из файла. Если пусто, то используешь умолчательные. В конце START сбрасываешь переменные в файл.

 

Из советника можно как-то задействовать встроенный трал?


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

Share this post


Link to post
Share on other sites
sashok

Здравствуйте.

Помогите,пожалуйста. Как организовать самые простые в МТ3 операции.

В МТ4 так же просто не получается.

//------------ в МТ3

 

If TotalTrades>0 then

{

If TotalTrades<4 then

{

If (CurTime-LastTradeTime)<620 then Exit;

mode=OrderValue(TotalTrades,VAL_TYPE);

If mode=OP_BUY then

{

SetOrder(OP_SELL,Lot*5+2*OrderValue(TotalTrades,VAL_LOTS),Bid,Slippage,0,0,White);

Exit;

};

If mode=OP_SELL then

{

SetOrder(OP_BUY,Lot*8+5*OrderValue(TotalTrades,VAL_LOTS),Ask,Slippage,0,0,White);

Exit;

};

};

};

//------------ в МТ4

 

if(total>0)

{

OrderSelect(total, SELECT_BY_TICKET);

int ol=OrderLots();

if(CurTime() - OrderOpenTime()<620) return(0);

if(total>3) return(0);

int mode= OrderType();

if(mode ==OP_BUY)

{

OrderSend(Symbol(),OP_SELL,lot*5+2*ol,Bid,slippage,0,0,0,0,0, White); return(0);

}

if(mode ==OP_SELL)

{

OrderSend(Symbol(),OP_BUY,lot*8+5*ol,Ask,slippage,0,0,0,0,0, White); return(0);

}

}

Открывает только 2 позиции, хотя должен открываться через каждые 10 минут

Второй раз всего 0.5 лота, вместо 0.7, т.к. первый лот 0.1

1 2004.10.04 09:28 buy 1 0.10 1.2368 0.0000 0.0000

2 2004.10.04 09:38 sell 2 0.50 1.2373 0.0000 0.0000

3 2004.11.05 21:29close at stop2 0.50 1.2967 0.0000 0.0000 -2936.00 -436.00

4 2004.11.05 21:29close at stop1 0.10 1.2964 0.0000 0.0000 582.40 146.40

//------------ в МТ3

If TotalTrades>0 then

{

for cnt=1 to TotalTrades

{

If (CurTime-OrderValue(cnt,VAL_OPENTIME))>86400 then

{

While TotalTrades>0

{

for cnt=1 to TotalTrades

{

mode=OrderValue(cnt,VAL_TYPE);

If mode=OP_BUY then

{

CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,3,Red);

};

If mode=OP_SELL then

{

CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Ask,3,Red);

};

};

};

SetArrow(Curtime,Ask+1*Point,74,Red);

EXIT;

};

};

};

//------------ в МТ4

if (total>0)

{

while (total>0)

{

for(cnt=0;cnt<total;cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(CurTime()-OrderOpenTime( )>86400)

{

if (OrderType()<=OP_SELL &&

OrderSymbol()==Symbol())

{

if(OrderType()==OP_BUY)

{

OrderClose(OrderTicket(),OrderLots(),Bid,3,Red);

}

if(OrderType()==OP_SELL)

{

OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);

}

}

}

}

}

SetIndexArrow(2,74);

return(0);

}

Вообще не закрывает позиции, которые простояли больше суток.

Не так все будет просто переделать. Вроде уже освоился с одним языком, теперь, Конечно, интересно осваивать новое, но очень медленно доходит.

Sashok

.


___________________________________________

Во всех удачах благодарите обстоятельства,

а в неудачах, вините только себя

_________________________________________

Share this post


Link to post
Share on other sites
sashok

Спасибо, с первой частью понял. Надо ol в double поместить.

//----MT 4--------

if(total>0)

{

OrderSelect(total, SELECT_BY_TICKET);

mode= OrderType();

double ol=OrderLots();

if(OrderType()<=OP_SELL && // check for opened position OP_BUY or OP_SELL

OrderSymbol()==Symbol()) // check symbol

{

if(CurTime() - OrderOpenTime()<620) return(0);

if(mode ==OP_BUY)

{

//---------------


___________________________________________

Во всех удачах благодарите обстоятельства,

а в неудачах, вините только себя

_________________________________________

Share this post


Link to post
Share on other sites
k005

Скажите лоху, кто знает, как в МТ4 сделать, чтоб комментарий к индикатору писался не в левом верхнем углу графика, а в правом верхнем

И еще, плиз, как записать, чтоб линия индикатора на графике МТ4 рисовалась не по биду, а бид+спред

Заранее длагодарен


Коррекция обусловлена открытием твоей позиции

Share this post


Link to post
Share on other sites
Илья_0

подскажите, сложно ли сделать эксперта из индюка,и добавить к нему несколько правил?

Share this post


Link to post
Share on other sites
Rosh
подскажите, сложно ли сделать эксперта из индюка,и добавить к нему несколько правил?

 

Несложно, правда, еще проще сделать советника, который по этому индикатору будет открывать/закрывать позиции.

Share this post


Link to post
Share on other sites
ESk

Подскажите, как в mql4 достать цену закрытия последней позиции?

И какого типа надо использовать переменные для хранения в течении нескольких баров - глобальные или статические?

Share this post


Link to post
Share on other sites
T-1000
Подскажите, как в mql4 достать цену закрытия последней позиции?

И какого типа надо использовать переменные для хранения в течении нескольких баров - глобальные или статические?

 

Close[1] - tak kak i v MT3.

 

Meniajutsia tol'ko na mql4 iz mt3 High/Low/Open->High[0]/Low[0]/Open[0] :-)


That's no difference which theory and tactics you choose, the main objective is to earn money without playing casino in forex...

--------------------------------------------------------------------------

Share this post


Link to post
Share on other sites
Steve

Народ, можа кто сталкивался уже - нужен рецепт лечения.

 

В эксперте делается модификация ордера. При этом цена проверяется на отличие от уже имеющейся, чтобы при совпадении не вызывать модификацию.

Но на йене чего-то не срабатывает и в лог выдается строка раз за разом:

 

14:05:24 '64237': modify pending order #873251 sell limit 0.20 USDJPY at 111.2100 sl: 0.0000 tp: 110.8100 -> price: 111.2100 sl: 0.0000 tp: 110.8100

14:05:36 '64237': modify pending order #873251 sell limit 0.20 USDJPY at 111.2100 sl: 0.0000 tp: 110.8100 -> price: 111.2100 sl: 0.0000 tp: 110.8100

14:05:36 '64237': modify pending order #873251 sell limit 0.20 USDJPY at 111.2100 sl: 0.0000 tp: 110.8100 -> price: 111.2100 sl: 0.0000 tp: 110.8100

14:05:43 '64237': modify pending order #873251 sell limit 0.20 USDJPY at 111.2100 sl: 0.0000 tp: 110.8100 -> price: 111.2100 sl: 0.0000 tp: 110.8100

14:05:43 '64237': modify pending order #873251 sell limit 0.20 USDJPY at 111.2100 sl: 0.0000 tp: 110.8100 -> price: 111.2100 sl: 0.0000 tp: 110.8100

14:05:49 '64237': modify pending order #873251 sell limit 0.20 USDJPY at 111.2100 sl: 0.0000 tp: 110.8100 -> price: 111.2100 sl: 0.0000 tp: 110.8100

14:05:49 '64237': modify pending order #873251 sell limit 0.20 USDJPY at 111.2100 sl: 0.0000 tp: 110.8100 -> price: 111.2100 sl: 0.0000 tp: 110.8100

14:06:09 '64237': modify pending order #873251 sell limit 0.20 USDJPY at 111.2100 sl: 0.0000 tp: 110.8100 -> price: 111.2100 sl: 0.0000 tp: 110.8100

14:06:09 '64237': modify pending order #873251 sell limit 0.20 USDJPY at 111.2100 sl: 0.0000 tp: 110.8100 -> price: 111.2100 sl: 0.0000 tp: 110.8100

14:06:29 '64237': modify pending order #873251 sell limit 0.20 USDJPY at 111.2100 sl: 0.0000 tp: 110.8100 -> price: 111.2100 sl: 0.0000 tp: 110.8100

14:06:29 '64237': modify pending order #873251 sell limit 0.20 USDJPY at 111.2100 sl: 0.0000 tp: 110.8100 -> price: 111.2100 sl: 0.0000 tp: 110.8100

14:06:47 '64237': modify pending order #873251 sell limit 0.20 USDJPY at 111.2100 sl: 0.0000 tp: 110.8100 -> price: 111.2100 sl: 0.0000 tp: 110.8100

14:06:47 '64237': modify pending order #873251 sell limit 0.20 USDJPY at 111.2100 sl: 0.0000 tp: 110.8100 -> price: 111.2100 sl: 0.0000 tp: 110.8100

14:06:59 '64237': modify pending order #873251 sell limit 0.20 USDJPY at 111.2100 sl: 0.0000 tp: 110.8100 -> price: 111.2100 sl: 0.0000 tp: 110.8100

14:06:59 '64237': modify pending order #873251 sell limit 0.20 USDJPY at 111.2100 sl: 0.0000 tp: 110.8100 -> price: 111.2100 sl: 0.0000 tp: 110.8100

 

То есть цена уже имеет нужное значение, но проверка типа (взято из кода):

if (OrderType()==OP_BUYLIMIT){

p1=oprice;

p2=prprice;

if (OrderOpenPrice()!=p1 || OrderTakeProfit()!=p2) {

OrderModify(OrderTicket(),p1,0,p2,0,Green);

Print ("модиф BUYLIMIT ", OrderOpenPrice(), "->", p1, " t/p ", OrderTakeProfit(),"->", p2);

Sleep(5000);

}

 

}

 

 

не срабатывает.

Пока замечено только на йене.

Может там с разрядностью чего-то не то?

На других парах вроде такого нет.

Share this post


Link to post
Share on other sites
Rosh

Не видно кода, откуда берутся значения p1, p2 ?

Нормализуются ли они с точностью до Digits и почему проверятся просто не совпадение?

Share this post


Link to post
Share on other sites
Steve
Не видно кода, откуда берутся значения p1, p2 ?

Нормализуются ли они с точностью до Digits и почему проверятся просто не совпадение?

 

Ну вообще это переменные внутри функции.

 

Вот текст:

 

//****функция модификации отложенного ордера

int modOrder(int num, double oprice, double prprice){

int t, cnt1;

double p1, p2;

t=OrdersTotal();

for(cnt1=0;cnt1<t;cnt1++){

OrderSelect(cnt1, SELECT_BY_POS, MODE_TRADES);

if (OrderSymbol()==Symbol() && OrderMagicNumber()==num){

if ((OrderOpenPrice()!=oprice || OrderTakeProfit()!=prprice) && oprice!=0 && prprice!=0) {

if (OrderType()==OP_BUYLIMIT){

p1=oprice;

p2=prprice;

if (OrderOpenPrice()!=p1 || OrderTakeProfit()!=p2) {

OrderModify(OrderTicket(),p1,0,p2,0,Green);

Print ("модиф BUYLIMIT ", OrderOpenPrice(), "->", p1, " t/p ", OrderTakeProfit(),"->", p2);

Sleep(5000);

}

}

if (OrderType()==OP_SELLLIMIT){

p1=oprice;

p2=prprice;

if (OrderOpenPrice()!=p1 || OrderTakeProfit()!=p2) {

OrderModify(OrderTicket(),p1,0,p2,0,Green);

Print ("модиф SELLLIMIT ", OrderOpenPrice(), "->", p1, " t/p ", OrderTakeProfit(),"->", p2);

Sleep(5000);

}

}

}

if (OrderType()==OP_BUY && OrderTakeProfit()==0 && oprice!=0) {

OrderModify(OrderTicket(),oprice,0,oprice+Step*Point,0,Green);

Print ("модицикация активного ордера, если тэйкпрофит равен нулю");

}

if (OrderType()==OP_SELL && OrderTakeProfit()==0 && oprice!=0) {

OrderModify(OrderTicket(),oprice,0,oprice-Step*Point,0,Green);

Print ("модицикация активного ордера, если тэйкпрофит равен нулю");

}

}

}

return (1);

}

 

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

 

А проверка для того, чтобы не вызывать модификацию, если ни один из двух параметров (цена отложенного или тэйкпрофит) не менялся. Это должно исключить повторные вызовы.

 

Насчет дигится чего-то не понял. Это же вроде для преобразования в строку. Тут переменные типа double

Share this post


Link to post
Share on other sites
Rosh
Не видно кода, откуда берутся значения p1, p2 ?

Нормализуются ли они с точностью до Digits и почему проверятся просто не совпадение?

 

Ну вообще это переменные внутри функции.

 

Вот текст:

 

//****функция модификации отложенного ордера

int modOrder(int num, double oprice, double prprice){

.....

 

Насчет дигится чего-то не понял. Это же вроде для преобразования в строку. Тут переменные типа double

 

Пойдем дальше - откуда берутся double oprice, double prprice, то есть, нужен кусок кода, который вызывает эту функцию, чтобы я увидел каким образом эти значения вычисляются. Вопрос о Digits начинает подкреплять мою уверенность о лишних знаках после запятой.

Share this post


Link to post
Share on other sites
Steve

Отправил в личку весь код.

В принципе они особо никак не вычисляются. Все переменные формата double.

А указанные значения просто получаются из функции, где находится ордер с соответстующим магическим номером и оттуда через стандартную функцию OrderOpenPrice( ) получаем указанные переменные.

То есть никаких особых вычислений и преобразований.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×