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

Ugar

Гуру форума
На самом деле учебником "это" не назовёшь. Сделано абы-как... Лучше смотри чьи-н. коды и изучай как они написано, а потом когда будет понимать как работаю эксперты, сможешь сама писать. А "то" что на оф. сайте.. используй как документацию и не более того. Документация с большего сносная, а учебника по сути нет, одно название..
Ты являешься хорошим примером, как не надо изучать язык. В твоих кодах косяки способные насмешить даже новичка. Не зная основ изучать чужие готовые программы не рационально.
Прежде чем разбирать чужой код для обучения, нужно быть уверенным что этот код написан достаточно грамотно что бы работал надёжно. Не зная языка и не имея опыта, оценить это весьма сложно. Вынос всей программы в пользовательские функции не показатель грамотности программиста. И соответственно надёжности работы программы. Ты типичный пример.
Даже если код написан грамотно и надёжно, всех хитростей и нюансов не уловишь, они могут быть не явными, но значимыми для обеспечения надёжной работы программы. В хороших учебниках написано как решить задачу, почему именно так и пример кода.
Изучать нужно по букварю. Их навалом, главное выбрать правильный. Заглядывать в чужой код можно и ногда нужно, но не для того что бы использовать его как учебник. Чужой код скорее подсказка. Например, при написании своей программы, не получается сообразить как решить какую то задачу. В этом случае можно найти чужой код в котором эта задача решена и подглядеть как. Но проще спросить у опытных программистов. Правда, они часто отвечают конкретным ответом, на конкретный вопрос, без каких то нюансов. Подразумевая что нюансы уже известны.
 

hoz

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


Ugar, Тыкать проще всего, а как подсказать, то сразу в сторону... Вот так Спасибо! То что я спрашивал, я уже сам сделал, так как ждать ответ сутками не есть пригодный мне вариант.
А вообще, я имел ввиду именно смотреть чей-то код в плане понять как работают программы... Я именно это и советовал.. Зачем повторяться?
Есс-но, что человек, который не понимает вообще ничего будет искать программу по проще, а потому уже посложнее возьмётся. Это даже и писать не стоит, так как оно логично.
В конце концов, мы тут не подкалывать друг друга собрались, а помогать и объяснять. А в данном случае это больше похоже на канкретный упрёк.
Если ты считаешь, что я в чём-то не прав, так и скажи прямо. Не зачем юлить вдоль и поперёк.
Что касается ошибок, да.. у меня это бывает, т.к. я не профи, но решать им я уже научился в большинстве случаев.
Да и вообще, каким боком я к тому учебнику отношусь? Если не могли написать адекватный учебник, это косяк создателей языка, а я тут не причём. Лично я изучал всё на чужих кодах, и читал книги по Си. Но не программисту книги по Си и С++ читать довольно сложно, поэтому я и не посылаю туда. И это не только мои слова.
Но если учебника у " авторов " не получилось создать, нужно это признать, а не защищать их.. Хотя Allis Amazing сама убедиться скоро на сколько адекватен это " учебник ":rolf:
 
Последнее редактирование:

Ugar

Гуру форума
Ugar, Тыкать проще всего, а как подсказать, то сразу в сторону... Вот так Спасибо! То что я спрашивал, я уже сам сделал, так как ждать ответ сутками не есть пригодный мне вариант.
Я подсказывал, но моё мнение тебя не интересовало. Сам сусам.
А вообще, я имел ввиду именно смотреть чей-то код в плане понять как работают программы... Я именно это и советовал.. Зачем повторяться?
Я об этом и писал. Зачем советуешь другим, способ как изучать язык, если сам его не изучил?
Если не могли написать адекватный учебник, это косяк создателей языка, а я тут не причём. Лично я изучал всё на чужих кодах, и читал книги по Си.
Вот это и заметно. Создатели языка не писали учебник. Автор Сергей Ковалёв, а не метаквоты.
Но если учебника у " авторов " не получилось создать, нужно это признать, а не защищать их..
Если учебник размещён на сайте mql значит он одобрен метаквотами, так же это может означать что, по их мнению, именно в этом учебнике меньше косяков. Учебников по MQL4 навалом, не нравится этот можно найти другой. Лично я изучал по другому. К сожалению он у меня не сохранился.
 

Алекc1234

Местный житель
Подскажите, вот есть такой код
PHP:
Expand Collapse Copy
for(int i=0; i<=OrdersTotal()-1; i++) 
 { 
 if(OrderSelect(i,SELECT_BY_POS))
 { 
 if(OrderMagicNumber()==magic) 
 { 
 if(OrderSymbol()==Symbol()) 
 { 
int fir_or_time = OrderOpenTime();
int i = iBarShift(NULL,0,fir_or_time);
break; 
 } 
 } 
 } 
 }
Его мне подсказал eevviill. Здесь указано время первого открытого ордера. А как указать, используя те же данные, цену первого открытого ордера?То есть что-то вроде OrderOpenPrice? Но конечно, в правильном коде...
 

eevviill

Заблокирован
Подскажите, вот есть такой код

Его мне подсказал eevviill. Здесь указано время первого открытого ордера. А как указать, используя те же данные, цену первого открытого ордера?То есть что-то вроде OrderOpenPrice? Но конечно, в правильном коде...

PHP:
Expand Collapse Copy
for(int i=0; i<=OrdersTotal()-1; i++) 
 { 
 if(OrderSelect(i,SELECT_BY_POS))
 { 
 if(OrderMagicNumber()==magic) 
 { 
 if(OrderSymbol()==Symbol()) 
 { 
double fir_op_pr=OrderOpenPrice();
break; 
 } 
 } 
 } 
 }
 

Алекc1234

Местный житель
PHP:
Expand Collapse Copy
for(int i=0; i<=OrdersTotal()-1; i++) 
 { 
 if(OrderSelect(i,SELECT_BY_POS))
 { 
 if(OrderMagicNumber()==magic) 
 { 
 if(OrderSymbol()==Symbol()) 
 { 
double fir_op_pr=OrderOpenPrice();
break; 
 } 
 } 
 } 
 }
Спасибо, eevviill, но мне хочется, чтобы цена открытия была именно на указанной мной свече, то есть как я уже писал, типа так - OrderOpenPrice. Возможно такое?
 

Алекc1234

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

eevviill

Заблокирован
Спасибо, eevviill, но мне хочется, чтобы цена открытия была именно на указанной мной свече, то есть как я уже писал, типа так - OrderOpenPrice. Возможно такое?

PHP:
Expand Collapse Copy
for(int i=0; i<=OrdersTotal()-1; i++)  
 {  
 if(OrderSelect(i,SELECT_BY_POS)) 
 {  
 if(OrderMagicNumber()==magic)  
 {  
 if(OrderSymbol()==Symbol())  
 {  
int fir_or_time = OrderOpenTime(); 
int i = iBarShift(NULL,0,fir_or_time); 
break;  
 }  
 }  
 }  
 }


PHP:
Expand Collapse Copy
for(int i=0; i<=OrdersTotal()-1; i++)  
 {  
 if(OrderSelect(i,SELECT_BY_POS)) 
 {  
 if(OrderMagicNumber()==magic)  
 {  
 if(OrderSymbol()==Symbol())  
 {  
if(OrderOpenTime()>=Time[i] && OrderOpenTime()<Time[i-1])
{
double fir_op_on_bar_price=OrderOpenPrice();
break;  
}
 }  
 }  
 }  
 }
 

Allis Amazing

Интересующийся
Ай, спасибо, посмотрю. Просто человек который знает тему, всегда может отличить "толковый букварь" от "ну что-то там на эту тему написано")))
Изучать нужно по букварю. Их навалом, главное выбрать правильный.

Так вот же жжжжж, это и попросила в итоге!
Господа программисты, подскажите, пожалуйста, ПРАВИЛЬНЫЙ букварь!!
 

hoz

Активный участник
Я подсказывал, но моё мнение тебя не интересовало. Сам сусам.


Где ты подсказывал? Мне очень интересно увидеть тот пост...

Я об этом и писал. Зачем советуешь другим, способ как изучать язык, если сам его не изучил?


Вопрос поствлен не верно. Я язык изучил, но ещё не на 100%. Ну логично что всё знать сразу не будешь. Хотя уже понаписал череду экспертов различных, и, уже понимание есть довольно-таки ясное. НО не всегда.. не спорю..

Вот это и заметно. Создатели языка не писали учебник. Автор Сергей Ковалёв, а не метаквоты.


Да я в курсе, не хотел уже канкретно на Кавалёва наезжать. НО метаквоты вообще мудаки, сами вообще ничего не сделали для блага пользователей, только деньги стригут с ДЦ и не более того. Это называется "зажрались".


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


Хватает учебников по Си, а по MQL4 всё тоже самое. Хотя есть на английском языке, но.. там уже нужно знать английский язык, и не каждый будет читать её (хотя я читал кусками, что интересно).

Если учебник размещён на сайте mql значит он одобрен метаквотами, так же это может означать что, по их мнению, именно в этом учебнике меньше косяков.


Это может означать лишь то, что метаквотовцам плевать на то, какой там учебник. Сами они и пальцем не пошевелили, чтобы пользователю с нуля научиться программировать чётко и ясно.
 
Последнее редактирование:

Ugar

Гуру форума
Очень не желательно объявлять переменную внутри цикла или после условия.
Код:
Expand Collapse Copy
[COLOR=#000000][COLOR=#007700]for([/COLOR][COLOR=#0000BB]int i[/COLOR][COLOR=#007700]=[/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700]; [/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700]<=[/COLOR][COLOR=#0000BB]OrdersTotal[/COLOR][COLOR=#007700]()-[/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700]; [/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700]++)   
 {   
 if([/COLOR][COLOR=#0000BB]OrderSelect[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB]SELECT_BY_POS[/COLOR][COLOR=#007700]))  
 {   
 if([/COLOR][COLOR=#0000BB]OrderMagicNumber[/COLOR][COLOR=#007700]()==[/COLOR][COLOR=#0000BB]magic[/COLOR][COLOR=#007700])   
 {   
 if([/COLOR][COLOR=#0000BB]OrderSymbol[/COLOR][COLOR=#007700]()==[/COLOR][COLOR=#0000BB]Symbol[/COLOR][COLOR=#007700]())   
 {   
if([/COLOR][COLOR=#0000BB]OrderOpenTime[/COLOR][COLOR=#007700]()>=[/COLOR][COLOR=#0000BB]Time[/COLOR][COLOR=#007700][[/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700]] && [/COLOR][COLOR=#0000BB]OrderOpenTime[/COLOR][COLOR=#007700]()<[/COLOR][COLOR=#0000BB]Time[/COLOR][COLOR=#007700][[/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700]-[/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700]]) 
{ 
[/COLOR][COLOR=#0000BB]double fir_op_on_bar_price[/COLOR][COLOR=#007700]=[/COLOR][COLOR=#0000BB]OrderOpenPrice[/COLOR][COLOR=#007700](); 
break;   
} 
 }   
 }   
 }   
 }  [/COLOR][/COLOR]
При таком объявлении переменной, в случае отсутствия ордеров открытых советником, переменная fir_op_on_bar_price не будет существовать, так как не была объявлена. Значит применять её за пределами цикла можно будет только при наличии ордеров советника. При отсутствии, обращение к переменной, приведёт к ошибке, или даже зависанию программы.
То же а в этом коде
Код:
Expand Collapse Copy
[COLOR=#000000][COLOR=#007700]for([/COLOR][COLOR=#0000BB]int i[/COLOR][COLOR=#007700]=[/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700]; [/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700]<=[/COLOR][COLOR=#0000BB]OrdersTotal[/COLOR][COLOR=#007700]()-[/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700]; [/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700]++)   
 {   
 if([/COLOR][COLOR=#0000BB]OrderSelect[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB]SELECT_BY_POS[/COLOR][COLOR=#007700]))  
 {   
 if([/COLOR][COLOR=#0000BB]OrderMagicNumber[/COLOR][COLOR=#007700]()==[/COLOR][COLOR=#0000BB]magic[/COLOR][COLOR=#007700])   
 {   
 if([/COLOR][COLOR=#0000BB]OrderSymbol[/COLOR][COLOR=#007700]()==[/COLOR][COLOR=#0000BB]Symbol[/COLOR][COLOR=#007700]())   
 {   
[/COLOR][COLOR=#0000BB]int fir_or_time [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]OrderOpenTime[/COLOR][COLOR=#007700]();  
[/COLOR][COLOR=#0000BB]int i [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]iBarShift[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]NULL[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB]fir_or_time[/COLOR][COLOR=#007700]);  
break;   
 }   
 }   
 }   
 }  [/COLOR][/COLOR]
Здесь переменные fir_or_time будут существовать только при наличии ордеров советника. И ещё fir_or_time должна быть datetime, а не int типа. Переменная i объявлена в цикле for и в ней порядковый номер ордера. И тут же объявлена повторно и в ней номер бара. Кроме буквы i есть ещё и другие для переменных. Так же можно использовать сочетание букв.

Пожалуй лучше объявлять переменные заранее, а внутри цикла только присваивать им значение. Например в начале функции start() самое удобное место для объявления локальных переменных.
 

Алекc1234

Местный житель
Очень не желательно объявлять переменную внутри цикла или после условия.
Код:
Expand Collapse Copy
[COLOR=#000000][COLOR=#007700]for([/COLOR][COLOR=#0000BB]int i[/COLOR][COLOR=#007700]=[/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700]; [/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700]<=[/COLOR][COLOR=#0000BB]OrdersTotal[/COLOR][COLOR=#007700]()-[/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700]; [/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700]++)   
 {   
 if([/COLOR][COLOR=#0000BB]OrderSelect[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB]SELECT_BY_POS[/COLOR][COLOR=#007700]))  
 {   
 if([/COLOR][COLOR=#0000BB]OrderMagicNumber[/COLOR][COLOR=#007700]()==[/COLOR][COLOR=#0000BB]magic[/COLOR][COLOR=#007700])   
 {   
 if([/COLOR][COLOR=#0000BB]OrderSymbol[/COLOR][COLOR=#007700]()==[/COLOR][COLOR=#0000BB]Symbol[/COLOR][COLOR=#007700]())   
 {   
if([/COLOR][COLOR=#0000BB]OrderOpenTime[/COLOR][COLOR=#007700]()>=[/COLOR][COLOR=#0000BB]Time[/COLOR][COLOR=#007700][[/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700]] && [/COLOR][COLOR=#0000BB]OrderOpenTime[/COLOR][COLOR=#007700]()<[/COLOR][COLOR=#0000BB]Time[/COLOR][COLOR=#007700][[/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700]-[/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700]]) 
{ 
[/COLOR][COLOR=#0000BB]double fir_op_on_bar_price[/COLOR][COLOR=#007700]=[/COLOR][COLOR=#0000BB]OrderOpenPrice[/COLOR][COLOR=#007700](); 
break;   
} 
 }   
 }   
 }   
 }  [/COLOR][/COLOR]
При таком объявлении переменной, в случае отсутствия ордеров открытых советником, переменная fir_op_on_bar_price не будет существовать, так как не была объявлена. Значит применять её за пределами цикла можно будет только при наличии ордеров советника. При отсутствии, обращение к переменной, приведёт к ошибке, или даже зависанию программы.
То же а в этом коде
Код:
Expand Collapse Copy
[COLOR=#000000][COLOR=#007700]for([/COLOR][COLOR=#0000BB]int i[/COLOR][COLOR=#007700]=[/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700]; [/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700]<=[/COLOR][COLOR=#0000BB]OrdersTotal[/COLOR][COLOR=#007700]()-[/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700]; [/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700]++)   
 {   
 if([/COLOR][COLOR=#0000BB]OrderSelect[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB]SELECT_BY_POS[/COLOR][COLOR=#007700]))  
 {   
 if([/COLOR][COLOR=#0000BB]OrderMagicNumber[/COLOR][COLOR=#007700]()==[/COLOR][COLOR=#0000BB]magic[/COLOR][COLOR=#007700])   
 {   
 if([/COLOR][COLOR=#0000BB]OrderSymbol[/COLOR][COLOR=#007700]()==[/COLOR][COLOR=#0000BB]Symbol[/COLOR][COLOR=#007700]())   
 {   
[/COLOR][COLOR=#0000BB]int fir_or_time [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]OrderOpenTime[/COLOR][COLOR=#007700]();  
[/COLOR][COLOR=#0000BB]int i [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]iBarShift[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]NULL[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB]fir_or_time[/COLOR][COLOR=#007700]);  
break;   
 }   
 }   
 }   
 }  [/COLOR][/COLOR]
Здесь переменные fir_or_time будут существовать только при наличии ордеров советника. И ещё fir_or_time должна быть datetime, а не int типа. Переменная i объявлена в цикле for и в ней порядковый номер ордера. И тут же объявлена повторно и в ней номер бара. Кроме буквы i есть ещё и другие для переменных. Так же можно использовать сочетание букв.

Пожалуй лучше объявлять переменные заранее, а внутри цикла только присваивать им значение. Например в начале функции start() самое удобное место для объявления локальных переменных.

Спасибо, действительно, по варианту eevvillla в тестере происходило зависание, а когда присвоил разные буквы переменным в цикле и в номере бара, то заработало! И всё-таки всё-равно не так как хотелось бы. Может Вы подскажете, как правильно в коде сделать мою просьбу?
 

hoz

Активный участник
Так вот же жжжжж, это и попросила в итоге!
Господа программисты, подскажите, пожалуйста, ПРАВИЛЬНЫЙ букварь!!


Держи! У каждого автора разные темы по своему разобраны. Но в целом, вполне адекватные книги.
 

Вложения

hoz

Активный участник
Ну тогда расскажи мне. зачем существует datetime тип?


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

Ugar

Гуру форума
Для того чтобы указывать тип для переменных даты. Дата и время это разные вещи. На днях я просматривал форум мкьэловский, и там, как-раз таки коснулись вопроса подобного. В общем-то все дружно согласились с тем, что время это инт, и сказал это профессионал изначально, которому я лично доверяю.
Ух ты, а я не знал. Тогда будь добр, поясни чем отличается дата от времени?
Конкретно о чём шла речь изначально
datetime OrderOpenTime( )
Возвращает время открытия выбранного ордера.
Это дата или время? Если время то почему в нем есть дата?
Если дата то почему в нём есть время?
Сам проверь, после выбора ордера, напечатай в журнал
Print(TimeToStr(OrderOpenTime(),TIME_DATE));
Print(TimeToStr(OrderOpenTime(),TIME_SECONDS));
А можешь напечатать одной строкой
Print(TimeToStr(OrderOpenTime(),TIME_DATE | TIME_SECONDS));
А то что на форумах пишут надо фильтровать своими мозгами. В этом поможет справочник и Print()

А вот если бы ты почитал учебник, такого бы не писал на форуме и не позорился. Легко бы разбирался где можно int, а где datetime.
_http://book.mql4.com/ru/functions/datetime

Для грамотного программиста хватило бы и справочника
int Day( )
int DayOfWeek( )
int Hour( )
int TimeHour( datetime time)
...
datetime TimeCurrent( )
datetime TimeLocal( )
datetime OrderOpenTime( )
datetime OrderCloseTime( )
Если не видишь и не понимаешь разницы, зачем затеваешь спор?
 
Последнее редактирование:

chocolate

Гуру форума
Огромная просьба большие выкладки кода вставлять под спойлер

пример текста
PHP:
Expand Collapse Copy
[SPOILER]пример текста[/SPOILER]
 

progenitor

Прохожий
Запись в массивы

В функции начальной инициализации init хочу заполнить массив(ы) для дальнейшей обработки уже в функции start. но массив получается с одними нулями.

//--- buffers

double ma[]; //массив для скользящей средней
double stoch[]; //массив для записи стохастика

int init()
{

SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ma);


int bars_for_count = Bars;

for(int i=0; i<bars_for_count; i++)
{
ma=iMA(Symbol(),240,52,0,MODE_EMA,PRICE_CLOSE,i);
stoch=iStochastic(Symbol(),60,4,7,3,MODE_SMA,PRICE_CLOSE,1,i);

Alert("ma="+ma);
Alert("stoch="+stoch);
}
return(0);
}

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

qqmber

Почетный гражданин
В функции начальной инициализации init хочу заполнить массив(ы) для дальнейшей обработки уже в функции start. но массив получается с одними нулями.
...
алерты для проверки, при первом запуске все нули, после компиляции только в скользящей стедней появляются значения а стохастик по прежнему нули пишет.
Кто подскажет где путаница?
Заранее благодарен
Память под индексные буфера выделяется после выполнения init(), т.е. заполнять их можно только в start().
Если перезагрузка кода вызвана его перекомпиляцией, то глобальные массивы не переинициализируются, ma[] будет иметь отведенную память и какие-то значения даже в init(), но я бы не стал на это рассчитывать.
Под стохастик место вообще не будет выделено пока он не объявлен индексным буфером.
 
Верх