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

mobidik

-----
TimeDay() возвращает день месяца и если в истории ордеров открыты ордера за всю историю, то будут выбраны все ордера закрытые в указанное число всех месяцев и всех лет.

Полностью согласен, но у тописталкера был вопрос: что то не так сделал, возвращает 0?
 

AlexeyVik

Программист mql4 mql5
Полностью согласен, но у тописталкера был вопрос: что то не так сделал, возвращает 0?
А на этот случай была предусмотрена ещё одна фраза
А в таком варианте надо запускать отладку и смотреть что на каком этапе получается.
:D
 

fs256

Местный знаток
Я-бы вместо t = TimeDay(TimeCurrent()) использовал t = iTime (_Symbol, PERIOD_D1, 0) или ещё лучше CopyTime(_Symbol, PERIOD_D1, 0, 1, time_array) и выборка ордеров
if(OrderCloseTime() > t) или соответственно if(OrderCloseTime() > time_array[0])

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

На фига такие сложности? Я бы сделал так (не стал сразу писать, но раз пошла такая пьянка... :D)
Закрытые ордера смотреть в обратку (они же по времени закрытия) и если день другой - выходить,
а на счет отрицательного мэджика, я пока ничего не слышал оО

Код:
int ClosePosLastTime(string sy,int mn) 
{
 int counter=0; 
 for(int i=OrdersHistoryTotal()-1; i>=0; i--) 
 {if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) 
  {if(OrderSymbol()==sy||(OrderSymbol()==_Symbol&&sy="0")) 
   {if(OrderType()<2&&OrderMagicNumber()==mn)
    {if(TimeDay(OrderCloseTime())!=Day()) break;
     counter++;}}}}
 return(counter);  
}
 

AlexeyVik

Программист mql4 mql5
На фига такие сложности? Я бы сделал так (не стал сразу писать, но раз пошла такая пьянка... :D)
Закрытые ордера смотреть в обратку (они же по времени закрытия) и если день другой - выходить,
а на счет отрицательного мэджика, я пока ничего не слышал оО

Код:
int ClosePosLastTime(string sy,int mn) 
{
 int counter=0; 
 for(int i=OrdersHistoryTotal()-1; i>=0; i--) 
 {if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) 
  {if(OrderSymbol()==sy||(OrderSymbol()==_Symbol&&sy="0")) 
   {if(OrderType()<2&&OrderMagicNumber()==mn)
    {if(TimeDay(OrderCloseTime())!=Day()) break;
     counter++;}}}}
 return(counter);  
}
1. Никаких сложностей. Надо хоть постепенно привыкать к новшествам языка и общим с mql5 функциям.
2. Отрицательный магик, это манера написания Кима. Если -1 значит все магики.
 

Prelagatay

Местный житель
Добрый вечер. Товарищи программисты опять требуется ваша помощь. Никак не могу победить функцию iCastom. Надобно получить сигналы по алертам индикатора в советник. При оптимизации уровень edbl High сов. видит, а уровень edbl Low нет, в чём ошибка понять никак не могу. Помогите пожалуйста разобраться.
double Signal1 = iCustom(_Symbol,0,"10.2 TMA slope v.1.4B 4.30 _3", OtherTimeFrames,select_other_tf_to_show,H_Pos_MTF,V_Pos_MTF,
Font_Size_MTF,Corner_MTF,Font_Color_MTF,eintPeriod,edblHigh1,edblLow1,atrPeriod,Font_Color,H_Pos,V_Pos,
Corner,Font_Size,Font_Size_text,H_Pos_text,V_Pos_text,Text_Corner,alert,7,1);
double Signal2 = iCustom(_Symbol,0,"10.2 TMA slope v.1.4B 4.30 _3", OtherTimeFrames,select_other_tf_to_show,H_Pos_MTF,V_Pos_MTF,
Font_Size_MTF,Corner_MTF,Font_Color_MTF,eintPeriod,edblHigh1,edblLow1,atrPeriod,Font_Color,H_Pos,V_Pos,
Corner,Font_Size,Font_Size_text,H_Pos_text,V_Pos_text,Text_Corner,alert,7,2);
 

Вложения

  • 10.2 TMA slope v.1.4B 4.30 _3.mq4
    21,3 КБ · Просмотры: 34

fs256

Местный знаток
1. Никаких сложностей. Надо хоть постепенно привыкать к новшествам языка и общим с mql5 функциям.
2. Отрицательный магик, это манера написания Кима. Если -1 значит все магики.

Спасибо за инфо, mql5 так и так придется изучать, в свете последних новостей.
 

Genry_05

Отдыхает
Добрый вечер. Товарищи программисты опять требуется ваша помощь. Никак не могу победить функцию iCastom. Надобно получить сигналы по алертам индикатора в советник. При оптимизации уровень edbl High сов. видит, а уровень edbl Low нет, в чём ошибка понять никак не могу. Помогите пожалуйста разобраться.
double Signal1 = iCustom(_Symbol,0,"10.2 TMA slope v.1.4B 4.30 _3", OtherTimeFrames,select_other_tf_to_show,H_Pos_MTF,V_Pos_MTF,
Font_Size_MTF,Corner_MTF,Font_Color_MTF,eintPeriod,edblHigh1,edblLow1,atrPeriod,Font_Color,H_Pos,V_Pos,
Corner,Font_Size,Font_Size_text,H_Pos_text,V_Pos_text,Text_Corner,alert,7, 1);
double Signal2 = iCustom(_Symbol,0,"10.2 TMA slope v.1.4B 4.30 _3", OtherTimeFrames,select_other_tf_to_show,H_Pos_MTF,V_Pos_MTF,
Font_Size_MTF,Corner_MTF,Font_Color_MTF,eintPeriod,edblHigh1,edblLow1,atrPeriod,Font_Color,H_Pos,V_Pos,
Corner,Font_Size,Font_Size_text,H_Pos_text,V_Pos_text,Text_Corner,alert,7, 2);
Смотрим в код индикатора:

if(Time[inx]>last_alert && inx>=1)
{
if(gadblSlope[inx]>=edblHigh1 && gadblSlope[inx+1]<edblHigh1)
{
intAelrt[1] = 1;
if(alert) Alert("Tma Slope Up "+_Symbol+" "+Period());
last_alert=Time[inx];
}
if(gadblSlope[inx]<=edblLow1 && gadblSlope[inx+1]>edblLow1)
{
intAelrt[1] = 2;
if(alert) Alert("Tma Slope Down "+_Symbol+" "+Period());
last_alert=Time[inx];
}
}
И видим что буфер на первом баре принимает значение 1 или 2 при наличии сигнала.
Пока в вашем коде считывается значение буфера на первом " 7, 1);" и зачем-то на втором "7, 2);" баре, а
надо взять значение буфера на 1 баре и проверить на равенство 1 или 2.
 
Последнее редактирование:

ivansss

Новичок форума
Добрый день ув. форумчане. Вопрос такой:
Код:

for(int k=OrdersHistoryTotal()-1;k>=0;k--)
{
OrderSelect(k,SELECT_BY_POS,MODE_HISTORY);
if(OrderType()==0)
{
if(OrderProfit() > 0)
{
int count=iBarShift(Symbol(),Period(),OrderOpenTime());
int Hadle_1=FileOpen("Positions.csv",FILE_WRITE|FILE_READ|FILE_CSV)


FileSeek(Hadle_1, 10, SEEK_END);


double d1=0.0;
double d2=1.0;

for(int i = 1; i <= 3;i ++)
{inputs_1[i - 1] = Volume[count+i];}

double x_min_1 = inputs_1[ArrayMinimum(inputs_1,WHOLE_ARRAY,0)];
double x_max_1 = inputs_1[ArrayMaximum(inputs_1,WHOLE_ARRAY,0)];

for( i=0;i<ArraySize(inputs_normalize_1);i++)
{inputs_normalize_1=(((inputs_1-x_min_1)*(d2-d1))/(x_max_1-x_min_1)+d1); }

out_1 = CalculateNeuron(inputs_normalize_1,weight);

out_1 = ActivateNeuron(out_1);

double Error = (MathPow((1 - out_1),2)/1);


FileWrite(Hadle_1,DoubleToStr(out_1,5),DoubleToStr(Error,5),DoubleToStr(Volume[count+1],0),DoubleToStr(Volume[count+2],0),DoubleToStr(Volume[count+3],0),DoubleToStr(k,0));




FileClose(Hadle_1);
}

}
else break;
}





- как мне считать значения нужного столбца в файле csv, чтобы не перезаписывать постоянно данные одного и того же ордера ?
- как мне считать нужную пару строка - столбец?
Возможно с помощью команды FileSeek, вот только как , сколько ячейка занимает байт? Гуру помогите:please:
 

Flank

Новичок форума
Я-бы вместо t = TimeDay(TimeCurrent()) использовал t = iTime (_Symbol, PERIOD_D1, 0) или ещё лучше CopyTime(_Symbol, PERIOD_D1, 0, 1, time_array) и выборка ордеров
if(OrderCloseTime() > t) или соответственно if(OrderCloseTime() > time_array[0])

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

Да. И к моему глубокому сожалению вы правы. На бэктесте сов через какое то время просто перестает открывать ордера. Ну что ж, будем учиться дальше...

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

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

AlexeyVik

Программист mql4 mql5
Добрый день ув. форумчане. Вопрос такой:
Код:

for(int k=OrdersHistoryTotal()-1;k>=0;k--)
{
OrderSelect(k,SELECT_BY_POS,MODE_HISTORY);
if(OrderType()==0)
{
if(OrderProfit() > 0)
{
int count=iBarShift(Symbol(),Period(),OrderOpenTime());
int Hadle_1=FileOpen("Positions.csv",FILE_WRITE|FILE_READ|FILE_CSV)


FileSeek(Hadle_1, 10, SEEK_END);


double d1=0.0;
double d2=1.0;

for(int i = 1; i <= 3;i ++)
{inputs_1[i - 1] = Volume[count+i];}

double x_min_1 = inputs_1[ArrayMinimum(inputs_1,WHOLE_ARRAY,0)];
double x_max_1 = inputs_1[ArrayMaximum(inputs_1,WHOLE_ARRAY,0)];

for( i=0;i<ArraySize(inputs_normalize_1);i++)
{inputs_normalize_1=(((inputs_1-x_min_1)*(d2-d1))/(x_max_1-x_min_1)+d1); }

out_1 = CalculateNeuron(inputs_normalize_1,weight);

out_1 = ActivateNeuron(out_1);

double Error = (MathPow((1 - out_1),2)/1);


FileWrite(Hadle_1,DoubleToStr(out_1,5),DoubleToStr(Error,5),DoubleToStr(Volume[count+1],0),DoubleToStr(Volume[count+2],0),DoubleToStr(Volume[count+3],0),DoubleToStr(k,0));




FileClose(Hadle_1);
}

}
else break;
}





- как мне считать значения нужного столбца в файле csv, чтобы не перезаписывать постоянно данные одного и того же ордера ?
- как мне считать нужную пару строка - столбец?
Возможно с помощью команды FileSeek, вот только как , сколько ячейка занимает байт? Гуру помогите:please:

Сколько занимает надо считать самому. В документации есть всё что для этого надо. Например число int 4 байта, а double занимает 8 байт.
Последовательность записи и чтения должны быть такими?
Открыли файл .csv для чтения и записи. Начинаем писать
FileWrite(1, 2, n); записали первую строку. Каждая запятая это следующий столбец при просмотре в Excell и чтении файла.
Следующий FileWrite(1, 2, n); это уже следующая строка файла. Соответственно чтобы переместить файловый указатель на вторую строку надо от начала файла отсчитать столько байт, сколько данных записано в строке, плюс, если правильно помню 2 байта заголовка.
Если-же перемещать файловый указатель от конца файла, то надо смещение ставить отрицательным.
Надеюсь объяснил доходчиво.
 

ivansss

Новичок форума
Соответственно чтобы переместить файловый указатель на вторую строку надо от начала файла отсчитать столько байт, сколько данных записано в строке, плюс, если правильно помню 2 байта заголовка.
Если-же перемещать файловый указатель от конца файла, то надо смещение ставить отрицательным.
Надеюсь объяснил доходчиво.

У меня в строке 4 столбца, везде числа double, с пятью знаками после запятой.
Перемещая указатель на 10 от начала , у меня последний знак пропадает, смещаю на 20 ещё больше исчезает.
Так , а если у меня в строке 4 столбца , то в теории сдвиг на 50 байтов даст первую ячейку второй строки?
 

AlexeyVik

Программист mql4 mql5
У меня в строке 4 столбца, везде числа double, с пятью знаками после запятой.
Перемещая указатель на 10 от начала , у меня последний знак пропадает, смещаю на 20 ещё больше исчезает.
Так , а если у меня в строке 4 столбца , то в теории сдвиг на 50 байтов даст первую ячейку второй строки?
Не мало я помучился но так и не понял что происходит.
Почему-то записанные double числа имеют то 8, то 7, то 9 байт...
Предположительно: если дробная часть числа короче, то-есть на последнем месте 0, то это число занимает 7 байт. Глупость несусветная, но наверное придётся при случае разбираться, писать в Сервисдеск.
Данные до шестой строки занимают чётко 33 байта на 1 строку. 4 по 8 байт данные и 1 байт разделитель строк. А вот в 7й строке начинается геморрой...
110.752 110.822 110.741 110.778
110.775 110.824 110.755 110.787
110.788 110.888 110.766 110.782
110.783 110.906 110.773 110.874
110.874 110.883 110.751 110.769
110.769 110.874 110.716 110.78
110.78 110.806 110.67 110.699
110.699 110.718 110.65 110.68
110.681 110.725 110.651 110.717
110.716 110.833 110.697 110.828

Пытался записать нормализованные значения, ничего не получилось, всё равно незначащий 0 теряется.
Пока я эксперименты сворачиваю.
 

AlexeyVik

Программист mql4 mql5
Продолжение:

Если записан файл как бинарный, FILE_BIN, то всё получается чётко. По 8 байт на одно значение. И тогда читать получается с любого значения.
 

ivansss

Новичок форума
Если записан файл как бинарный, FILE_BIN, то всё получается чётко. По 8 байт на одно значение. И тогда читать получается с любого значения.

FileOpen("Positions.csv",FILE_WRITE|FILE_R EAD|FILE_CSV)
FILE_CSV меняем на бин, а расширение csv оставляем?
 

AlexeyVik

Программист mql4 mql5
FileOpen("Positions.csv",FILE_WRITE|FILE_R EAD|FILE_CSV)
FILE_CSV меняем на бин, а расширение csv оставляем?
Даже если оставить .csv то прочесть его открытием в Excell не получится. Расширение файла ничего не значит. Хоть .bmp пусть будет при флаге FILE_BIN или другом флаге или вообще без расширения, не важно.
 

ivansss

Новичок форума
Даже если оставить .csv то прочесть его открытием в Excell не получится. Расширение файла ничего не значит. Хоть .bmp пусть будет при флаге FILE_BIN или другом флаге или вообще без расширения, не важно.

Вы меня запутали, так как конкретно прописать флаги, чтобы корректно все работало?
 

loki177

Активный участник
вопрос к программистам

Поделитесь кодом для обновления индикатора, который действует так, как при обновлении настроек, и только на этот индикатор, а не как AutoRefresh, когда всё что на графике - перезапускается. Прошу пример в mq4. Еще раз обращаю внимание - без смены таймфрейма конечно же.
 
Верх