Другими словами написать советник? Вопрос слишком общий и не конкретный.. ))
И да, что за индикатор?
Тогда вот:
_http://forum.mql4.com/ru/38949
Букварь там _http://book.mql4.com/ru/Подскажите, как жто мне в коде написать.. или дайте ссылку на источник с примерами как это делается верно!) Спасибо!!lease:
Огромное спасибо! По моей просьбе работы максимум на пол-часа.. и вы это знаете.. и сдерете за это 150 долларов не менее.. может быть что-то более конкретное подскажите? дадите пример советника, который торгует по подобному алгоритму? я немного изменю код и все..
Вау, спасибо! Сделал так, теперь работает всёпросто изумительно, как и хотелось!Думаю, не надо объяснять как использовать переменные на глобальном уровне для передачи команд в в функцию таймера и как передать результат выполнения обратно.
#property copyright "0ll"
#property strict
input double lot = 0.1;
input int SmoothPeriod = 5;
input int SmoothMethod = 1;
input int TP = 0;
input int SL = 0;
input int Magic = 24011;
int OnInit()
{
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason) { }
int idir = -1, odir = -1, ocnt = 0;
double opl = 0, bufBuy, bufSell, bufBuy2, bufSell2;
void OnTick()
{
if (!NewBar()) return;
ordCount();
bufBuy = iCustom(NULL,0,"Market\\volution",SmoothPeriod,SmoothMethod,0,1,1);
bufBuy2 = iCustom(NULL,0,"Market\\volution",SmoothPeriod,SmoothMethod,0,1,2);
bufSell = iCustom(NULL,0,"Market\\volution",SmoothPeriod,SmoothMethod,0,2,1);
bufSell2 = iCustom(NULL,0,"Market\\volution",SmoothPeriod,SmoothMethod,0,2,2);
idir = -1;
if (bufBuy == bufSell && bufBuy2 == EMPTY_VALUE && bufSell2 != EMPTY_VALUE) idir = OP_BUY;
if (bufBuy == bufSell && bufBuy2 != EMPTY_VALUE && bufSell2 == EMPTY_VALUE) idir = OP_SELL;
// if (odir >= 0 && opl > 2)ordClose(odir);
if (idir == 1 - odir)
{
ordClose(odir);
}
if (idir >= 0 && odir < 0) ordOpen(idir);
}
//+------------------------------------------------------------------+
void ordOpen(int dir)
{
int tik=-1;
tik = OrderSend(_Symbol,dir,lot,(dir==OP_BUY?Ask:Bid),10,0,0,"Check_Indi",Magic,0,(dir==OP_BUY?Blue:Red));
if (tik > 0)
{
odir = dir; ocnt = 1;
OrderSelect(tik, SELECT_BY_TICKET);
OrderModify(OrderTicket(),OrderOpenPrice(),(dir==OP_BUY?Bid-SL*_Point:Ask+SL*_Point),(dir==OP_BUY?Bid+TP*_Point:Ask-TP*_Point),0);
}
}
void ordClose(int dir)
{
if (OrderClose(OrderTicket(),OrderLots(), (dir==OP_BUY?Bid:Ask),10, Gray)) { odir = -1; ocnt = 0; opl = 0; }
}
void ordCount()
{
int no;
odir = -1; ocnt = 0; opl = 0;
for (no=0; no < OrdersTotal(); no++) //Сбор инфы об открытых ордерах
{
if (!OrderSelect(no, SELECT_BY_POS, MODE_TRADES)) continue;
if (!(OrderSymbol()== _Symbol && OrderMagicNumber() == Magic)) continue;
odir = OrderType();
ocnt++;
opl += OrderProfit()+OrderCommission()+OrderSwap();
}
}
bool NewBar()
{
static datetime new_Bar;
if (new_Bar == Time[1]) return(false); //Если бар не закрыт - выход
new_Bar = Time[1];
return(true);
}
ребята, привет!
Помогите сделать так, чтобы советник открывал и закрывал сделки по стрелкам.. (воявилась стрелка ввер - открывает покупки и закрывает продажи, если такие есть.. и наоборот) стрелки не рисуются! и появляются на 1-м баре.. по открытию текущего. НУЖНО ЧТОБЫ ТОРГОВАЛ СОВЕТНИК ТОЛЬКО ПО ОТКРЫТИЮ ТЕКУЩЕГО БАРА. Это простейший советник для проверки мат. ожидания от торговли чисто по сигналам индикатора. Сделки открываются с фикс. лотом. Без ТП и СЛ.
Индикатор не могу скинуть, потому как он платный..
у индикатора 2 буфера. 1й- покупки, 2й - продажи
Условия стрелки ВВЕРХ:
на 1-м баре: 1й буфер равен 2му буферу
на 2-м баре: 1й буфер пуст, а 2й буфер не пуст и содержит цену
Условия стрелки ВНИЗ:
на 1-м баре: 1й буфер равен 2му буферу
на 2-м баре: 1й буфер не пуст и содержит цену, а 2й буфер пуст
Должен открывать сделки ТОЛЬКО ПО ОТКРЫТИЮ БАРА! не на каждом тике.
вот я написал код.. но что-то не открываются сделки. Хотя индикатор вызывается корректно и его параметры тоже. (в режиме визуализации индикатор отображается с нужными параметрами)
Код:#property copyright "0ll" #property strict input double lot = 0.1; input int SmoothPeriod = 5; input int SmoothMethod = 1; input int TP = 0; input int SL = 0; input int Magic = 24011; int OnInit() { return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { } int idir = -1, odir = -1, ocnt = 0; double opl = 0, bufBuy, bufSell, bufBuy2, bufSell2; void OnTick() { if (!NewBar()) return; ordCount(); bufBuy = iCustom(NULL,0,"Market\\volution",SmoothPeriod,SmoothMethod,0,1,1); bufBuy2 = iCustom(NULL,0,"Market\\volution",SmoothPeriod,SmoothMethod,0,1,2); bufSell = iCustom(NULL,0,"Market\\volution",SmoothPeriod,SmoothMethod,0,2,1); bufSell2 = iCustom(NULL,0,"Market\\volution",SmoothPeriod,SmoothMethod,0,2,2); idir = -1; if (bufBuy == bufSell && bufBuy2 == EMPTY_VALUE && bufSell2 != EMPTY_VALUE) idir = OP_BUY; if (bufBuy == bufSell && bufBuy2 != EMPTY_VALUE && bufSell2 == EMPTY_VALUE) idir = OP_SELL; // if (odir >= 0 && opl > 2)ordClose(odir); if (idir == 1 - odir) { ordClose(odir); } if (idir >= 0 && odir < 0) ordOpen(idir); } //+------------------------------------------------------------------+ void ordOpen(int dir) { int tik=-1; tik = OrderSend(_Symbol,dir,lot,(dir==OP_BUY?Ask:Bid),10,0,0,"Check_Indi",Magic,0,(dir==OP_BUY?Blue:Red)); if (tik > 0) { odir = dir; ocnt = 1; OrderSelect(tik, SELECT_BY_TICKET); OrderModify(OrderTicket(),OrderOpenPrice(),(dir==OP_BUY?Bid-SL*_Point:Ask+SL*_Point),(dir==OP_BUY?Bid+TP*_Point:Ask-TP*_Point),0); } } void ordClose(int dir) { if (OrderClose(OrderTicket(),OrderLots(), (dir==OP_BUY?Bid:Ask),10, Gray)) { odir = -1; ocnt = 0; opl = 0; } } void ordCount() { int no; odir = -1; ocnt = 0; opl = 0; for (no=0; no < OrdersTotal(); no++) //Сбор инфы об открытых ордерах { if (!OrderSelect(no, SELECT_BY_POS, MODE_TRADES)) continue; if (!(OrderSymbol()== _Symbol && OrderMagicNumber() == Magic)) continue; odir = OrderType(); ocnt++; opl += OrderProfit()+OrderCommission()+OrderSwap(); } } bool NewBar() { static datetime new_Bar; if (new_Bar == Time[1]) return(false); //Если бар не закрыт - выход new_Bar = Time[1]; return(true); }
без индикатора будут долго помогать
нужен индикатор и по моему проще написать новый сов
#property copyright "l"
#property strict
input double lot = 0.1;
input int Period = 5;
input int TP = 0;
input int SL = 0;
input int Magic = 24011;
int OnInit()
{
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason) { }
int idir = -1, odir = -1, ocnt = 0;
double opl = 0, bufBuy, bufSell, bufBuy2, bufSell2;
void OnTick()
{
if (!NewBar()) return;
ordCount();
bufBuy = iCustom(NULL,0,"Arrows",Period,0,1);
bufBuy2 = iCustom(NULL,0,"Arrows",Period,0,2);
bufSell = iCustom(NULL,0,"Arrows",Period,1,1);
bufSell2 = iCustom(NULL,0,"Arrows",Period,1,2);
idir = -1;
if (bufBuy == bufSell && bufBuy2 == EMPTY_VALUE && bufSell2 != EMPTY_VALUE) idir = OP_BUY;
if (bufBuy == bufSell && bufBuy2 != EMPTY_VALUE && bufSell2 == EMPTY_VALUE) idir = OP_SELL;
// if (odir >= 0 && opl > 2)ordClose(odir);
if (idir == 1 - odir)
{
ordClose(odir);
}
if (idir >= 0 && odir < 0) ordOpen(idir);
}
//+------------------------------------------------------------------+
void ordOpen(int dir)
{
int tik=-1;
tik = OrderSend(_Symbol,dir,lot,(dir==OP_BUY?Ask:Bid),10,0,0,"Check_Indi",Magic,0,(dir==OP_BUY?Blue:Red));
if (tik > 0)
{
odir = dir; ocnt = 1;
OrderSelect(tik, SELECT_BY_TICKET);
OrderModify(OrderTicket(),OrderOpenPrice(),(dir==OP_BUY?Bid-SL*_Point:Ask+SL*_Point),(dir==OP_BUY?Bid+TP*_Point:Ask-TP*_Point),0);
}
}
void ordClose(int dir)
{
if (OrderClose(OrderTicket(),OrderLots(), (dir==OP_BUY?Bid:Ask),10, Gray)) { odir = -1; ocnt = 0; opl = 0; }
}
void ordCount()
{
int no;
odir = -1; ocnt = 0; opl = 0;
for (no=0; no < OrdersTotal(); no++) //Сбор инфы об открытых ордерах
{
if (!OrderSelect(no, SELECT_BY_POS, MODE_TRADES)) continue;
if (!(OrderSymbol()== _Symbol && OrderMagicNumber() == Magic)) continue;
odir = OrderType();
ocnt++;
opl += OrderProfit()+OrderCommission()+OrderSwap();
}
}
bool NewBar()
{
static datetime new_Bar;
if (new_Bar == Time[1]) return(false); //Если бар не закрыт - выход
new_Bar = Time[1];
return(true);
}
Вот индикатор. по нему не выходит у меня написать советник.. Работать должен только ПО ОТКРЫТИЮ БАРА! и заключать покупки (закрывать продажи если такие есть) при стрелке вверх. И заключать продажи (закрывать покупки если такие есть) при стрелке вниз. Фиксир. лотом без ТП И СЛ.
Код:#property copyright "l" #property strict input double lot = 0.1; input int Period = 5; input int TP = 0; input int SL = 0; input int Magic = 24011; int OnInit() { return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { } int idir = -1, odir = -1, ocnt = 0; double opl = 0, bufBuy, bufSell, bufBuy2, bufSell2; void OnTick() { if (!NewBar()) return; ordCount(); bufBuy = iCustom(NULL,0,"Arrows",Period,0,1); bufBuy2 = iCustom(NULL,0,"Arrows",Period,0,2); bufSell = iCustom(NULL,0,"Arrows",Period,1,1); bufSell2 = iCustom(NULL,0,"Arrows",Period,1,2); idir = -1; if (bufBuy == bufSell && bufBuy2 == EMPTY_VALUE && bufSell2 != EMPTY_VALUE) idir = OP_BUY; if (bufBuy == bufSell && bufBuy2 != EMPTY_VALUE && bufSell2 == EMPTY_VALUE) idir = OP_SELL; // if (odir >= 0 && opl > 2)ordClose(odir); if (idir == 1 - odir) { ordClose(odir); } if (idir >= 0 && odir < 0) ordOpen(idir); } //+------------------------------------------------------------------+ void ordOpen(int dir) { int tik=-1; tik = OrderSend(_Symbol,dir,lot,(dir==OP_BUY?Ask:Bid),10,0,0,"Check_Indi",Magic,0,(dir==OP_BUY?Blue:Red)); if (tik > 0) { odir = dir; ocnt = 1; OrderSelect(tik, SELECT_BY_TICKET); OrderModify(OrderTicket(),OrderOpenPrice(),(dir==OP_BUY?Bid-SL*_Point:Ask+SL*_Point),(dir==OP_BUY?Bid+TP*_Point:Ask-TP*_Point),0); } } void ordClose(int dir) { if (OrderClose(OrderTicket(),OrderLots(), (dir==OP_BUY?Bid:Ask),10, Gray)) { odir = -1; ocnt = 0; opl = 0; } } void ordCount() { int no; odir = -1; ocnt = 0; opl = 0; for (no=0; no < OrdersTotal(); no++) //Сбор инфы об открытых ордерах { if (!OrderSelect(no, SELECT_BY_POS, MODE_TRADES)) continue; if (!(OrderSymbol()== _Symbol && OrderMagicNumber() == Magic)) continue; odir = OrderType(); ocnt++; opl += OrderProfit()+OrderCommission()+OrderSwap(); } } bool NewBar() { static datetime new_Bar; if (new_Bar == Time[1]) return(false); //Если бар не закрыт - выход new_Bar = Time[1]; return(true); }
Спасибо!
а открытый код индикатора есть ?
чтоб прорисать его в советник нужно открытый код индикатора !
Юра, говоришь о стрелках а в предыдущем посте говорил о том, что на первом баре одновременно присутствует значение и первого и второго буфера. Это свойственно двухцветным линейным индикаторам.Владимир, в данном случае - открытый код не нужен! Достоточно компилированного! (индикатор не нужно встраивать в советник в виде его исходного кода.) Индикатор будет использоватся - как компилированный отдельный файл. там проще простого! Просто у меня навыки не такие профессиональные как у вас.
Доступ к идикатору будет через ICustom . 2 буфера. 0 - стрелка покупки. 1-Стрелка Продажи
Установите на график и все увидите. Мне только нужно чтобы по Открытому бару торговал! И открывал(закрывал) против. сделки по появлению стрелки. Макс. кол-во ордеров в рынке - 1. СЛ И ТП 0. Лот - фиксированный.
Я и так дал все, что нужно. Открытого кода у меня нету. Тут все просто! но, тем не менее, мне нужна помощь.. не выходит чего-то у меня)
Спасибо! Есть желание и возможность - помогите)
if ([COLOR=Red][B]bufBuy == bufSell[/B][/COLOR] && bufBuy2 == EMPTY_VALUE && bufSell2 != EMPTY_VALUE) idir = OP_BUY;
if ([COLOR=Red][B]bufBuy == bufSell[/B][/COLOR] && bufBuy2 != EMPTY_VALUE && bufSell2 == EMPTY_VALUE) idir = OP_SELL;
Юра, говоришь о стрелках а в предыдущем посте говорил о том, что на первом баре одновременно присутствует значение и первого и второго буфера. Это свойственно двухцветным линейным индикаторам.
Для ясности сделай скрин с индикатором.
Потом, не совсем корректно поставлено условие, хотя это не критично.
Для условия достаточно проверки на первом баре сигнал есть а на втором нет.Код:if ([COLOR=Red][B]bufBuy == bufSell[/B][/COLOR] && bufBuy2 == EMPTY_VALUE && bufSell2 != EMPTY_VALUE) idir = OP_BUY; if ([COLOR=Red][B]bufBuy == bufSell[/B][/COLOR] && bufBuy2 != EMPTY_VALUE && bufSell2 == EMPTY_VALUE) idir = OP_SELL;
if(bufBuy != EMPTY_VALUE && bufBuy2 == EMPTY_VALUE)
Потом, не надо наворачивать код дополнительными переменными типа idir = OP_BUY; достаточно после условия вызвать ordOpen(OP_BUY);
И ещё одна недокументированная фишка для закрытия ордераOrderClose(OrderTicket(),OrderLots(), OrderClosePrice(),10, Gray)МТ сам разберётся по какой цене Ask или Bid закрывать ордер в зависимости от типа ордера.
Стрелки кто рисует на чарте? Вы или индюк?
Если рисует индюк - можно сделать проще ваш советник.
Нужно просто делать поиск стрелки на первом баре, есть стрелка 233 - значит бай и закрываем селл, есть стрелка 234 - селл и закрываем бай.
И не задавайте глупых вопросов! я уже запарился объяснять!! и код выложил, и индикатор для примера.. и четко описал условия входа-выхода. условия расчета лотов.. и прочего.Это простейший советник для проверки мат. ожидания от торговли чисто по сигналам индикатора.