Ваши вопросы по языку MQL4

Abi

Элитный участник
Слушай,Юра... Не надо так эмоционально...
Вам тут пытаются помочь, наверно.
Не выкладыванием готового кода(что порочно в корне), а натолкнуть на решение.
Вы ведь программируете, как выяснилось.
Что мешает вам вынести в extern int коды сигналов? И пусть они будут хоть "блюдечко с голубой каемочкой" - главное чтоб для них был определен код.
Вносите во внешние данные какие коды искать и вуаля!!! Универсальный поисковик сигналов готов!!!
 

Yura Vakulenko

Активный участник
Слушай,Юра... Не надо так эмоционально...
Вам тут пытаются помочь, наверно.
Не выкладыванием готового кода(что порочно в корне), а натолкнуть на решение.
Вы ведь программируете, как выяснилось.
Что мешает вам вынести в extern int коды сигналов? И пусть они будут хоть "блюдечко с голубой каемочкой" - главное чтоб для них был определен код.
Вносите во внешние данные какие коды искать и вуаля!!! Универсальный поисковик сигналов готов!!!

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

проще, проверить условие появления стрелки. по-крайне мере мне так кажется.. да и не у всех индикаторов есть стрелки.

я уже написал и новый код.. все-равно ничего у меня с открытием ордеров не выходит! и даже кодов ошибок не выдает! вот новый код.
//+------------------------------------------------------------------+
//| indicator_test.mq4 |
//| |
//| |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""
//--------------------------------------------------------------------
extern int SmoothPeriod = 5,
SmoothMethod = 1,
Notify = 0;
extern double stoploss = 0,
takeprofit = 0,
TrailingStop = 0;
extern double LOT = 0.1;
extern bool Close_on_Oposite = true;
extern bool Buy_allow = true;
extern bool Sell_allow = true;
//--------------------------------------------------------------------
int STOPLEVEL,Magic=1234567890;
int timeprev = 0;
//--------------------------------------------------------------------

int OnInit()
{

return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason) { }


int start()
{
if (timeprev == Time[0]) return (0);
timeprev = Time[0];
STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
if (TrailingStop>=STOPLEVEL) TrailingStop();
//if (TimeBar==Time[0]) return(0);
double bufBuy, bufBuy2,bufSell,bufSell2;

bufBuy = iCustom(NULL,0,"Arrows",SmoothPeriod,0,1);
bufBuy2 = iCustom(NULL,0,"Arrows",SmoothPeriod,0,2);
bufSell = iCustom(NULL,0,"Arrows",SmoothPeriod,1,1);
bufSell2 = iCustom(NULL,0,"Arrows",SmoothPeriod,0,2);



//bufBuy = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,0,1);
//bufBuy2 = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,0,2);
//bufSell = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,1,1);
//bufSell2 = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,1,2);

double SL,TP;
if (Buy_allow)
{
if (bufBuy != EMPTY_VALUE && bufBuy2 == EMPTY_VALUE )//if (bufBuy==bufSell && bufSell2 !=EMPTY_VALUE && bufBuy2 == EMPTY_VALUE)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP = 0;
if (stoploss!=0) SL = NormalizeDouble(Bid - stoploss*Point,Digits); else SL = 0;
if (Close_on_Oposite) CLOSEORDER(OP_SELL);
int tik_buy = OrderSend(Symbol(),OP_BUY,LOT,NormalizeDouble(Ask,Digits),2,SL,TP,"Ind check buy",Magic,0,clrBlue);
if(tik_buy>0)
{
if(OrderSelect(tik_buy,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order #",tik_buy," opened : ",OrderOpenPrice());
}
else
Print("Error opening BUY order #",tik_buy," : ",GetLastError());
timeprev = Time[0];

}
}

if (Sell_allow)
{
if (bufSell != EMPTY_VALUE && bufSell2 == EMPTY_VALUE)//if (bufBuy==bufSell && bufSell2 ==EMPTY_VALUE && bufBuy2 != EMPTY_VALUE)
{
if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP = 0;
if (stoploss!=0) SL = NormalizeDouble(Ask + stoploss*Point,Digits); else SL = 0;
if (Close_on_Oposite) CLOSEORDER(OP_BUY);
int tik_sell = OrderSend(Symbol(),OP_SELL,LOT,NormalizeDouble(Bid,Digits),2,SL,TP,"Ind check sell",Magic,0,clrRed);
if(tik_sell>0)
{
if(OrderSelect(tik_sell,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order #",tik_sell," opened : ",OrderOpenPrice());
}
else
Print("Error opening SELL order #",tik_sell," : ",GetLastError());
timeprev = Time[0];

}
}

return(0);
}
//--------------------------------------------------------------------
void CLOSEORDER(int ord)
{
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if (OrderType()==OP_BUY && ord==OP_BUY)
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
if (OrderType()==OP_SELL && ord==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,CLR_NONE);
}
}
}
}
//--------------------------------------------------------------------
void TrailingStop()
{
int tip,Ticket;
double StLo,OSL,OOP;
for (int i=0; i<OrdersTotal(); i++)
{ if (OrderSelect(i, SELECT_BY_POS)==true)
{ tip = OrderType();
if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
OSL = NormalizeDouble(OrderStopLoss(),Digits);
OOP = NormalizeDouble(OrderOpenPrice(),Digits);
Ticket = OrderTicket();
if (tip==OP_BUY)
{
StLo = NormalizeDouble(Bid-TrailingStop*Point,Digits);
if (StLo > OSL && StLo > OOP)
{ if (!OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,White))
Print("TrailingStop Error ",GetLastError()," buy SL ",OSL,"->",StLo);
}
}
if (tip==OP_SELL)
{
StLo = NormalizeDouble(Ask+TrailingStop*Point,Digits);
if (StLo > OOP || StLo==0) continue;
if (StLo < OSL || OSL==0 )
{ if (!OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,White))
Print("TrailingStop Error ",GetLastError()," sell SL ",OSL,"->",StLo);
}
}
}
}
}
}
//--------------------------------------------------------------------
 
Последнее редактирование:

Abi

Элитный участник
Ну вот вставил ваш Arrows.ex4 в свою сову...
Все работае и ордера открывает...

Но в индюк видимо вставлена функция удаления всех объектов с чарта.
Поэтому по окончании теста нет визуализации открытия-закрытия ордеров.
На втором скрине обошел это ограничение - сделал принт-скрин прямо во время теста...
 

Вложения

  • 1H Eur-Usd.jpg
    1H Eur-Usd.jpg
    329,6 КБ · Просмотры: 43
  • 1H Eur-Usd 2nd.jpg
    1H Eur-Usd 2nd.jpg
    388,8 КБ · Просмотры: 36
Последнее редактирование:

Yura Vakulenko

Активный участник
Ну вот вставил ваш Arrows.ex4 в свою сову...
Все работае и ордера открывает...

Но в индюк видимо вставлена функция удаления всех объектов с чарта.
Поэтому нет визуализации открытия-закрытия ордеров.
ух ты! а что у вас за советник? можете поделится?? плиз!
 

Abi

Элитный участник
ух ты! а что у вас за советник? можете поделится?? плиз!

Это мой собственный универсальный советник-заготовка.
В него можно вставлять любой индюк или несколько индюков.
Описываю условия открытия ордеров согласно показаниям этих индюков.
По ним открываются ордера. Далее идут мои собственные фишки сопровождения бай и селл ордеров по отдельности, вывод в БУ, универсальный тралл сделок, реагирование на появление противоположного сигнала (так как сигнал индюков бывает как истинный, так и ложный) и т.д.
 

Yura Vakulenko

Активный участник
Это мой собственный универсальный советник-заготовка.
В него можно вставлять любой индюк или несколько индюков.
Описываю условия открытия ордеров согласно показаниям этих индюков.
По ним открываются ордера. Далее идут мои собственные фишки сопровождения бай и селл ордеров по отдельности, вывод в БУ, универсальный тралл сделок, реагирование на появление противоположного сигнала (так как сигнал индюков бывает как истинный, так и ложный) и т.д.

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

вышло у меня открывать ордера по моему условию! спасибо! теперь.. нужно как-то модифицировать условия закрытия ордеров.. я чуть позже скину логику закрытия. с рисунками.. подскажите, как это можно будет сделать? там не очень тяжело.. для закрытия будут использоватся сигналы другого индикатора. Тоже все сигналы с первого бара. там нужно реализовать частичное закрытие позиций, открытых по сигналам этого, основного индикатора.. в общем, не очень сложно.. но я пока не могу написать верно функции модификаций открытых ордеров.
 

Yura Vakulenko

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

Позиция закрывается полностью (100% объема) по противоположному сигналу (Большая КРАСНАЯ \ СИНЯЯ стрелки) и позиция закрывается частично по дополнительным сигналам (Маленькие желтые\синие стрелки). Все стрелки формируются на 1-м баре. И советник работает только по открытию бара.

т.е. Основной сигнал на закрытие позиции (и открытие противоположной) - это БОЛЬШИЕ СТРЕЛКИ

Дополнительный сигнал на закрытие Основной позиции - это маленькие стрелки. (Желтая малая стрелка - закрытие продаж. Синяя малая стрелка - закрытие покупок.)

Логика закрытия:

за начальную точку отсчета берется время открытия основной позиции. Одновременно в рынке может быть открыта 1 основная позиция ( по ОСНОВНОМУ СИГНАЛУ - БОЛЬШИЕ СТРЕЛКИ)

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

появилась 1-я малая стрелка - закрываем 25 % основной позиции. (при условии, что цена открытия нового бара, после появления малой стрелки больше\меньше внешней переменной N ). Если условие верно, тогда закрываем 25% основной позиции. Если не верно - тогда закрываем 0% основной позиции. На данном этапе закрыто или 0% или 25% основной позиции.

появилась 2-я малая стрелка - закрываем еще 25% основной позиции. (при условии, что на первой стрелке уже было закрытие 25 % основной позиции. если же такого закрытия не было, тогда закрываем 50% основной позиции.) На данном этапе закрыто или 50% основной позиции.

появилась 3-я малая стрелка - закрываем еще 25% основной позиции.
На данном этапе закрыто или 75% основной позиции.

появилась 4-я малая стрелка - закрываем еще 25% основной позиции. На данном этапе закрыто 100% основной позиции. Т.е. ордер закрыт. 4-я стрелка появляется крайне редко! в основном их только 3. и оставшиеся 25% позиции, после первых 3-х стрелок закрываются по основному противоположному сигналу.

если же не появилось ни одной из малых стрелок, тогда позиция закрывается на 100% по против. основному сигналу.

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

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

Помогите встроить такую функцию в код советника.

а вот текущий код советника..

//+------------------------------------------------------------------+
//| indicator_test.mq4 |
//| |
//| |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""
//--------------------------------------------------------------------
extern int SmoothPeriod = 5,
SmoothMethod = 1,
Notify = 0;
extern double stoploss = 0,
takeprofit = 0,
TrailingStop = 0;
extern double LOT = 0.1;
extern bool Close_on_Oposite = true;
extern bool Buy_allow = true;
extern bool Sell_allow = true;
extern bool mode_reverse = false;
//--------------------------------------------------------------------
int STOPLEVEL,Magic=1234567890;
//int redOrblueFlag=7;

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

int OnInit()
{

return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason) { }


int start()
{
int timeprev=0;
if (timeprev == Time[0]) return (0);
timeprev = Time[0];
//if (!NewBar()) return;
STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
if (TrailingStop>=STOPLEVEL) TrailingStop();
//if (TimeBar==Time[0]) return(0);
double bufBuy, bufBuy2,bufSell,bufSell2;

//bufBuy = iCustom(NULL,0,"Arrows",SmoothPeriod,0,1);
//bufSell = iCustom(NULL,0,"Arrows",SmoothPeriod,1,1);

bufBuy = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,0,1);
bufBuy2 = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,0,2);
bufSell = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,1,1);
bufSell2 = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,1,2);

double SL,TP;
if (Buy_allow)
{
if (bufBuy==bufSell && bufSell2 !=0 && bufBuy2 == 0)//if (bufBuy != 0 && bufSell == 0 )//
{
if (!mode_reverse)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP = 0;
if (stoploss!=0) SL = NormalizeDouble(Bid - stoploss*Point,Digits); else SL = 0;
if (Close_on_Oposite) CLOSEORDER(OP_SELL);
int tik_buy = OrderSend(Symbol(),OP_BUY,LOT,NormalizeDouble(Ask,Digits),2,SL,TP,"Ind check buy",Magic,0,clrBlue);
if(tik_buy>0)
{
if(OrderSelect(tik_buy,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order #",tik_buy," opened : ",NormalizeDouble(OrderOpenPrice(),Digits));
}
else
Print("Error opening BUY order #",tik_buy," : ",GetLastError());
}

else

{
if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP = 0;
if (stoploss!=0) SL = NormalizeDouble(Ask + stoploss*Point,Digits); else SL = 0;
if (Close_on_Oposite) CLOSEORDER(OP_BUY);
int tik_sell_on_reverse_buy = OrderSend(Symbol(),OP_SELL,LOT,NormalizeDouble(Bid,Digits),2,SL,TP,"Ind check sell",Magic,0,clrRed);
if(tik_sell_on_reverse_buy>0)
{
if(OrderSelect(tik_sell_on_reverse_buy,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order #",tik_sell_on_reverse_buy," opened : ",NormalizeDouble(OrderOpenPrice(),Digits));
}
else
Print("Error opening SELL order #",tik_sell_on_reverse_buy," : ",GetLastError());

}

}
}

if (Sell_allow)
{
if (bufBuy==bufSell && bufSell2 ==0 && bufBuy2 != 0)//if (bufSell != 0 && bufBuy == 0)//
{
if (!mode_reverse)
{

if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP = 0;
if (stoploss!=0) SL = NormalizeDouble(Ask + stoploss*Point,Digits); else SL = 0;
if (Close_on_Oposite) CLOSEORDER(OP_BUY);
int tik_sell = OrderSend(Symbol(),OP_SELL,LOT,NormalizeDouble(Bid,Digits),2,SL,TP,"Ind check sell",Magic,0,clrRed);
if(tik_sell>0)
{
if(OrderSelect(tik_sell,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order #",tik_sell," opened : ",NormalizeDouble(OrderOpenPrice(),Digits));
}
else
Print("Error opening SELL order #",tik_sell," : ",GetLastError());

}

else

{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP = 0;
if (stoploss!=0) SL = NormalizeDouble(Bid - stoploss*Point,Digits); else SL = 0;
if (Close_on_Oposite) CLOSEORDER(OP_SELL);
int tik_buy_on_reverse_sell = OrderSend(Symbol(),OP_BUY,LOT,NormalizeDouble(Ask,Digits),2,SL,TP,"Ind check buy",Magic,0,clrBlue);
if(tik_buy_on_reverse_sell>0)
{
if(OrderSelect(tik_buy_on_reverse_sell,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order #",tik_buy_on_reverse_sell," opened : ",NormalizeDouble(OrderOpenPrice(),Digits));
}
else
Print("Error opening BUY order #",tik_buy_on_reverse_sell," : ",GetLastError());

}
}
}

return (0);
}
//--------------------------------------------------------------------
void CLOSEORDER(int ord)
{
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if (OrderType()==OP_BUY && ord==OP_BUY)
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
if (OrderType()==OP_SELL && ord==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,CLR_NONE);
}
}
}
}
//--------------------------------------------------------------------
void TrailingStop()
{
int tip,Ticket;
double StLo,OSL,OOP;
for (int i=0; i<OrdersTotal(); i++)
{ if (OrderSelect(i, SELECT_BY_POS)==true)
{ tip = OrderType();
if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
OSL = NormalizeDouble(OrderStopLoss(),Digits);
OOP = NormalizeDouble(OrderOpenPrice(),Digits);
Ticket = OrderTicket();
if (tip==OP_BUY)
{
StLo = NormalizeDouble(Bid-TrailingStop*Point,Digits);
if (StLo > OSL && StLo > OOP)
{ if (!OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,White))
Print("TrailingStop Error ",GetLastError()," buy SL ",OSL,"->",StLo);
}
}
if (tip==OP_SELL)
{
StLo = NormalizeDouble(Ask+TrailingStop*Point,Digits);
if (StLo > OOP || StLo==0) continue;
if (StLo < OSL || OSL==0 )
{ if (!OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,White))
Print("TrailingStop Error ",GetLastError()," sell SL ",OSL,"->",StLo);
}
}
}
}
}

}

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

bool NewBar()
{
static datetime new_Bar;
if (new_Bar == Time[1]) return(false); //Если бар не закрыт - выход
new_Bar = Time[1];
return(true);
}

Смотрите рисунки ниже.
 

Вложения

  • close_logic_GBPUSDproM30_1.png
    close_logic_GBPUSDproM30_1.png
    52,3 КБ · Просмотры: 42
  • close_logic_GBPUSDproM30_2.png
    close_logic_GBPUSDproM30_2.png
    51,1 КБ · Просмотры: 35
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Юрий, а зачем смешивать правила написания кода старого формата и нового?
Почему инициализация наисана по-новому int OnInit() и по старому int start() почему не void OnTick()

Потом, научись писать алгоритм получается примерно так:
void OnTick()
{
// объявить переменные

// получить значения индикатора

// поставить условие на покупку
if()
{
// если условие выполнено вызвать функцию открытия ордера Buy
// и вызвать функцию закрытия ордера Sell (при этом не забыть проверить его наличие)
}
/////// то-же самое для продажи.
}
И не надо никаких лишних bool переменных.
Если что-то не работает, то поставить Print("Работает"); Если в журнале увидел такую распечатку, значит переносишь этот принт в другой блок кода. Таким образом находишь какой блок не работает.
Когда этот кусок кода будет отлажен, тогда можно будет дописать алгоритм ММ, реверсом и прочими плюшками. А так получается, что советник не открывает ордер, но уже присутствует возможность реверсивной работы. Соответственно усложняет работу с кодом.

В одном из сообщений Abi высказал и моё мнение, подсказывать написанием куска кода не в моих правилах.
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Вот что ещё заметил, хотя это в проверочном варианте.

bufBuy = iCustom(NULL,0,"Arrows",SmoothPeriod,0,1);
bufBuy2 = iCustom(NULL,0,"Arrows",SmoothPeriod,0,2);
bufSell = iCustom(NULL,0,"Arrows",SmoothPeriod,1,1);
bufSell2 = iCustom(NULL,0,"Arrows",SmoothPeriod,0,2);

С такой ошибкой вряд-ли можно получить правильную работу советника.

Твой индикатор сколько имеет буферов?
Покажи вот такой скрин
 

Вложения

  • 00.png
    00.png
    41,6 КБ · Просмотры: 21

matro3

Почетный гражданин
А лучше нажми Ctrl + D и заскринь на свече с сигналом
 

volodymyr67

Гуру форума
Владимир, в данном случае - открытый код не нужен! Достоточно компилированного! (индикатор не нужно встраивать в советник в виде его исходного кода.) Индикатор будет использоватся - как компилированный отдельный файл. там проще простого! Просто у меня навыки не такие профессиональные как у вас.

Доступ к идикатору будет через ICustom . 2 буфера. 0 - стрелка покупки. 1-Стрелка Продажи

Установите на график и все увидите. Мне только нужно чтобы по Открытому бару торговал! И открывал(закрывал) против. сделки по появлению стрелки. Макс. кол-во ордеров в рынке - 1. СЛ И ТП 0. Лот - фиксированный.

Я и так дал все, что нужно. Открытого кода у меня нету. Тут все просто! но, тем не менее, мне нужна помощь.. не выходит чего-то у меня)

Спасибо!:) Есть желание и возможность - помогите)

Юрий !
Я сам делетант просто у меня есть готовый советник где можно прописать буфер индюка , вот и всё
но для этого нужно открытый код
 

Yura Vakulenko

Активный участник
Юрий, а зачем смешивать правила написания кода старого формата и нового?

bool переменные я тсвил не для проверки работоспособности, а для проверки прибыльности от разного типа торговых операций. И возможной оптимизации.

Я не совсем хорошо разбираюсь в синтаксисе нового и старого мкл 4. поэтому в коде и встретились новый и старый тип объявления. Я не знаю, где найти руководство по новому языку мкл 4. В справке терминала у меня старый тип языка. Когда-то все делали ошибки.

Насчет условий открытия ордеров - я уже разобрался. у меня все работает. Были не верные условия их открытия.

Индикатор имеет 6 буферов. 0-1-2-3-4-5

Спасибо за помощь!
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
bool переменные я тсвил не для проверки работоспособности, а для проверки прибыльности от разного типа торговых операций. И возможной оптимизации.

Я не совсем хорошо разбираюсь в синтаксисе нового и старого мкл 4. поэтому в коде и встретились новый и старый тип объявления. Я не знаю, где найти руководство по новому языку мкл 4. В справке терминала у меня старый тип языка. Когда-то все делали ошибки.

Насчет условий открытия ордеров - я уже разобрался. у меня все работает. Были не верные условия их открытия.

Индикатор имеет 6 буферов. 0-1-2-3-4-5

Спасибо за помощь!
А как ты начинаешь создавать советник? Берёшь что было, переименовываешь и поехали? Отсюда видимо и встретились...
Чтобы увидеть справку (документацию) по языку встань на любое ключевое слово и нажми F1 и всё. Или посмотри здесь _http://docs.mql4.com/ru
 

Yura Vakulenko

Активный участник
А как ты начинаешь создавать советник? Берёшь что было, переименовываешь и поехали? Отсюда видимо и встретились...
Чтобы увидеть справку (документацию) по языку встань на любое ключевое слово и нажми F1 и всё. Или посмотри здесь _http://docs.mql4.com/ru

ну да. примерно так и вышло) открыл подобный советник и начал туда свой код впихивать)) это не важно сейчас.. сейчас важно сделать условия закрытия по описанномму выше алгоритму.. вы можете помочь?

и почему у меня в тестере стратегий в двух разных терминалах при одних и тех же натройках советник.. по разному открывает ордера по показаниям моего платного индикатора. В терминале Альпари - сделки открываются и закрываются некорректно (все настройки идентичны и на графике индикатор выглядит рабочим.. ) А в терминале Форекс Ком - в тестере стратегий - все впорядке. Индикатор активировался и первый раз устанавливался именно в терминал Форекс. ком. В терминал Альпари - индикатор перенесен из первого терминала.
 
Последнее редактирование:

Abi

Элитный участник
и почему у меня в тестере стратегий в двух разных терминалах при одних и тех же натройках советник.. по разному открывает ордера по показаниям моего платного индикатора.

возможно из-за разного серверного времени или еще каких настроек терминала.
Трудно гадать без самого индюка и того что и как он использует...
 

Yura Vakulenko

Активный участник
сколько буду стоить ответы на мои вопросы, что касаются торгового алгоритма советника? столько всего уже было написано... и потеряно времени...
 

AlexeyVik

Программист mql4 mql5
сколько буду стоить ответы на мои вопросы, что касаются торгового алгоритма советника? столько всего уже было написано... и потеряно времени...
Юрий, вопрос не в цене а в свободном времени (не торчать-же на форуме ради желания помочь тебе) и твоём желании делать так как тебе советуют.
Я тебе советовал начать с начала, а ты без уверенности нормальной работы первой части кода (открытие сделок) пишешь всё вместе и вопросы получаются скачущими. То не открывает, то на разных терминалах по разному работает, то не закрывает...
Но всё-же попытаюсь ответить на один из вопросов:
По разному открываются ордера потому, что отличаются показания индикатора. Показания индикатора отличаются потому, что разные OHLC у разных брокеров. А если индикатор использует объёмы, то вообще туши свет...

И ещё я не знаю как привязывается продукт из маркета. Может к терминалу?
Ты делаешь какую-то тайну из индикатора... а зачем? Давно дал-бы ссылку на него, там должна быть возможность скачать тестовый вариант и тогда мог-бы быть более конкретный разговор.
 
Последнее редактирование:

matro3

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

Позиция закрывается полностью (100% объема) по противоположному сигналу (Большая КРАСНАЯ \ СИНЯЯ стрелки) и позиция закрывается частично по дополнительным сигналам (Маленькие желтые\синие стрелки). Все стрелки формируются на 1-м баре. И советник работает только по открытию бара.

т.е. Основной сигнал на закрытие позиции (и открытие противоположной) - это БОЛЬШИЕ СТРЕЛКИ

Дополнительный сигнал на закрытие Основной позиции - это маленькие стрелки. (Желтая малая стрелка - закрытие продаж. Синяя малая стрелка - закрытие покупок.)

Логика закрытия:

за начальную точку отсчета берется время открытия основной позиции. Одновременно в рынке может быть открыта 1 основная позиция ( по ОСНОВНОМУ СИГНАЛУ - БОЛЬШИЕ СТРЕЛКИ)

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

появилась 1-я малая стрелка - закрываем 25 % основной позиции. (при условии, что цена открытия нового бара, после появления малой стрелки больше\меньше внешней переменной N ). Если условие верно, тогда закрываем 25% основной позиции. Если не верно - тогда закрываем 0% основной позиции. На данном этапе закрыто или 0% или 25% основной позиции.

появилась 2-я малая стрелка - закрываем еще 25% основной позиции. (при условии, что на первой стрелке уже было закрытие 25 % основной позиции. если же такого закрытия не было, тогда закрываем 50% основной позиции.) На данном этапе закрыто или 50% основной позиции.

появилась 3-я малая стрелка - закрываем еще 25% основной позиции.
На данном этапе закрыто или 75% основной позиции.

появилась 4-я малая стрелка - закрываем еще 25% основной позиции. На данном этапе закрыто 100% основной позиции. Т.е. ордер закрыт. 4-я стрелка появляется крайне редко! в основном их только 3. и оставшиеся 25% позиции, после первых 3-х стрелок закрываются по основному противоположному сигналу.

если же не появилось ни одной из малых стрелок, тогда позиция закрывается на 100% по против. основному сигналу.

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

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

Помогите встроить такую функцию в код советника.

а вот текущий код советника..

//+------------------------------------------------------------------+
//| indicator_test.mq4 |
//| |
//| |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""
//--------------------------------------------------------------------
extern int SmoothPeriod = 5,
SmoothMethod = 1,
Notify = 0;
extern double stoploss = 0,
takeprofit = 0,
TrailingStop = 0;
extern double LOT = 0.1;
extern bool Close_on_Oposite = true;
extern bool Buy_allow = true;
extern bool Sell_allow = true;
extern bool mode_reverse = false;
//--------------------------------------------------------------------
int STOPLEVEL,Magic=1234567890;
//int redOrblueFlag=7;

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

int OnInit()
{

return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason) { }


int start()
{
int timeprev=0;
if (timeprev == Time[0]) return (0);
timeprev = Time[0];
//if (!NewBar()) return;
STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
if (TrailingStop>=STOPLEVEL) TrailingStop();
//if (TimeBar==Time[0]) return(0);
double bufBuy, bufBuy2,bufSell,bufSell2;

//bufBuy = iCustom(NULL,0,"Arrows",SmoothPeriod,0,1);
//bufSell = iCustom(NULL,0,"Arrows",SmoothPeriod,1,1);

bufBuy = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,0,1);
bufBuy2 = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,0,2);
bufSell = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,1,1);
bufSell2 = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,1,2);

double SL,TP;
if (Buy_allow)
{
if (bufBuy==bufSell && bufSell2 !=0 && bufBuy2 == 0)//if (bufBuy != 0 && bufSell == 0 )//
{
if (!mode_reverse)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP = 0;
if (stoploss!=0) SL = NormalizeDouble(Bid - stoploss*Point,Digits); else SL = 0;
if (Close_on_Oposite) CLOSEORDER(OP_SELL);
int tik_buy = OrderSend(Symbol(),OP_BUY,LOT,NormalizeDouble(Ask,Digits),2,SL,TP,"Ind check buy",Magic,0,clrBlue);
if(tik_buy>0)
{
if(OrderSelect(tik_buy,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order #",tik_buy," opened : ",NormalizeDouble(OrderOpenPrice(),Digits));
}
else
Print("Error opening BUY order #",tik_buy," : ",GetLastError());
}

else

{
if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP = 0;
if (stoploss!=0) SL = NormalizeDouble(Ask + stoploss*Point,Digits); else SL = 0;
if (Close_on_Oposite) CLOSEORDER(OP_BUY);
int tik_sell_on_reverse_buy = OrderSend(Symbol(),OP_SELL,LOT,NormalizeDouble(Bid,Digits),2,SL,TP,"Ind check sell",Magic,0,clrRed);
if(tik_sell_on_reverse_buy>0)
{
if(OrderSelect(tik_sell_on_reverse_buy,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order #",tik_sell_on_reverse_buy," opened : ",NormalizeDouble(OrderOpenPrice(),Digits));
}
else
Print("Error opening SELL order #",tik_sell_on_reverse_buy," : ",GetLastError());

}

}
}

if (Sell_allow)
{
if (bufBuy==bufSell && bufSell2 ==0 && bufBuy2 != 0)//if (bufSell != 0 && bufBuy == 0)//
{
if (!mode_reverse)
{

if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP = 0;
if (stoploss!=0) SL = NormalizeDouble(Ask + stoploss*Point,Digits); else SL = 0;
if (Close_on_Oposite) CLOSEORDER(OP_BUY);
int tik_sell = OrderSend(Symbol(),OP_SELL,LOT,NormalizeDouble(Bid,Digits),2,SL,TP,"Ind check sell",Magic,0,clrRed);
if(tik_sell>0)
{
if(OrderSelect(tik_sell,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order #",tik_sell," opened : ",NormalizeDouble(OrderOpenPrice(),Digits));
}
else
Print("Error opening SELL order #",tik_sell," : ",GetLastError());

}

else

{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP = 0;
if (stoploss!=0) SL = NormalizeDouble(Bid - stoploss*Point,Digits); else SL = 0;
if (Close_on_Oposite) CLOSEORDER(OP_SELL);
int tik_buy_on_reverse_sell = OrderSend(Symbol(),OP_BUY,LOT,NormalizeDouble(Ask,Digits),2,SL,TP,"Ind check buy",Magic,0,clrBlue);
if(tik_buy_on_reverse_sell>0)
{
if(OrderSelect(tik_buy_on_reverse_sell,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order #",tik_buy_on_reverse_sell," opened : ",NormalizeDouble(OrderOpenPrice(),Digits));
}
else
Print("Error opening BUY order #",tik_buy_on_reverse_sell," : ",GetLastError());

}
}
}

return (0);
}
//--------------------------------------------------------------------
void CLOSEORDER(int ord)
{
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if (OrderType()==OP_BUY && ord==OP_BUY)
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
if (OrderType()==OP_SELL && ord==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,CLR_NONE);
}
}
}
}
//--------------------------------------------------------------------
void TrailingStop()
{
int tip,Ticket;
double StLo,OSL,OOP;
for (int i=0; i<OrdersTotal(); i++)
{ if (OrderSelect(i, SELECT_BY_POS)==true)
{ tip = OrderType();
if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
OSL = NormalizeDouble(OrderStopLoss(),Digits);
OOP = NormalizeDouble(OrderOpenPrice(),Digits);
Ticket = OrderTicket();
if (tip==OP_BUY)
{
StLo = NormalizeDouble(Bid-TrailingStop*Point,Digits);
if (StLo > OSL && StLo > OOP)
{ if (!OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,White))
Print("TrailingStop Error ",GetLastError()," buy SL ",OSL,"->",StLo);
}
}
if (tip==OP_SELL)
{
StLo = NormalizeDouble(Ask+TrailingStop*Point,Digits);
if (StLo > OOP || StLo==0) continue;
if (StLo < OSL || OSL==0 )
{ if (!OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,White))
Print("TrailingStop Error ",GetLastError()," sell SL ",OSL,"->",StLo);
}
}
}
}
}

}

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

bool NewBar()
{
static datetime new_Bar;
if (new_Bar == Time[1]) return(false); //Если бар не закрыт - выход
new_Bar = Time[1];
return(true);
}

Смотрите рисунки ниже.

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

Кроме того Ваш код не удобно читать ))

Вот кусок Вашего кода:
Код:
if (Buy_allow)
{
   if (bufBuy==bufSell && bufSell2 !=0 && bufBuy2 == 0)
   {
      if (!mode_reverse)
      {
         if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP = 0;
         if (stoploss!=0) SL = NormalizeDouble(Bid - stoploss*Point,Digits); else SL = 0;
         if (Close_on_Oposite) CLOSEORDER(OP_SELL);
         int tik_buy = OrderSend(Symbol(),OP_BUY,LOT,NormalizeDouble(Ask,Digits),2,SL,TP,"Ind check buy",Magic,0,clrBlue);
         if(tik_buy>0)
         {
            if(OrderSelect(tik_buy,SELECT_BY_TICKET,MODE_TRADES))
            Print("BUY order #",tik_buy," opened : ",NormalizeDouble(OrderOpenPrice(),Digits));
         }
         else
         Print("Error opening BUY order #",tik_buy," : ",GetLastError());
      }
      else
      {
         if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP = 0;
         if (stoploss!=0) SL = NormalizeDouble(Ask + stoploss*Point,Digits); else SL = 0;
         if (Close_on_Oposite) CLOSEORDER(OP_BUY);
         int tik_sell_on_reverse_buy = OrderSend(Symbol(),OP_SELL,LOT,NormalizeDouble(Bid,Digits),2,SL,TP,"Ind check sell",Magic,0,clrRed);
         if(tik_sell_on_reverse_buy>0)
         {
            if(OrderSelect(tik_sell_on_reverse_buy,SELECT_BY_TICKET,MODE_TRADES))
            Print("SELL order #",tik_sell_on_reverse_buy," opened : ",NormalizeDouble(OrderOpenPrice(),Digits));
         }
         else
         Print("Error opening SELL order #",tik_sell_on_reverse_buy," : ",GetLastError());
      }
   }
}
Понимаю так: Сигнал в BUY
если не включен реверс - покупаем
если включен - продаем
Но сигнал-то BUY. Не совсем понял эту конструкцию.

Еще у Вас две переменные, по сути означающие одно и то же: mode_reverse и Close_on_Oposite.
Если включен реверс, то позицию надо закрывать без необходимости проверки Close_on_Oposite.
Ваша стратегия, как я понял, не позволяет держать больше одной позиции, а это значит что одну из этих переменных надо удалить за ненадобностью.
Значит, если реверс выключен, то продолжаем держать позицию и игнорируем все сигналы в противоход.
Резюме: Close_on_Oposite - удаляем.

Далее. Не плохо бы привести код в примерно такой вид:
Код:
//--- Торговые константы
#define        ENTER_NONE              0
#define        ENTER_SELL_BIG          1
#define        ENTER_BUY_BIG           2
#define        ENTER_SELL_SMALL        3
#define        ENTER_BUY_SMALL         4

#define        POS_SELL                5
#define        POS_BUY                 6

#define        PART                    6
#define        ALL                     6

void OnTick()
  {
//---
   // Ищем сигнал для входа
   int nResult = SearchEnter();
   // Если позиции нет
   if(!pos.exist)
      // Если есть сигнал - отправляем его в блок торговых сделок
      if(nResult != ENTER_NONE) TradingBlock(nResult);
   // Если позиция есть
   else
   {
      // Позиция BUY
      if(pos.type == POS_BUY)
      {
         // Закрыть полностью
         if(nResult == ENTER_SELL_BIG) ClosePos(ALL);
         // Закрыть часть
         if(nResult == ENTER_SELL_SMALL) ClosePos(PART);
      }
      // Позиция SELL
      if(pos.type == POS_SELL)
      {
         // Закрыть полностью
         if(nResult == ENTER_BUY_BIG) ClosePos(ALL);
         // Закрыть часть
         if(nResult == ENTER_BUY_SMALL) ClosePos(PART);
      }
   }
   
  }
//+------------------------------------------------------------------+
int SearchEnter()
{
   int nResult = ENTER_NONE;
   
   return(nResult);
}
Проще вникать в него другим и самому приятней ))
Хотя это дело вкуса.
 

Alexz2107

Интересующийся
Возврат ;

Поздравляю всех с наступающим НГ! Подскажите, пожалуйста, ответ на глупый вопрос! В моей системе используются некоторые компоненты сторонних разработчиков и во многих местах в них используется return (0); вместо простого return; хотя тип этих скриптов void и по факту в работе никакие данные они не возвращают, просто выполняют действия. И вот в чем вопрос - это сделано вследствие неграмотности или есть какие-то подводные камни в языке, из-за чего и используется некорректный возврат?
 

matro3

Почетный гражданин
Оператор возврата return
В функциях с типом возвращаемого значения void необходимо использовать оператор return без выражения:
Код:
void SomeFunction()
  {
   Print("Hello!");
   return;    // этот оператор можно удалить
  }
 
Верх