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

Ugar

Гуру форума
Да что ты всё про бейсик вспоминаешь? Может ты будешь удивлён, но я ни одной программы не написал на С или С++. И вообще не пытался. И до изучения mql тоже работал только с бейсиком. Ничего сложного в этом нет, это условие такое-же как и в бейсике if((Q1 = 0 or A > B) and (Q2 = 0 or C < D) and Е > F)
Очень хотелось-бы чтобы не-было в этом примере грубых синтаксических ошибок. Всё-таки уже несколько лет не вспоминал о бейсике.
Да, это наверное его ещё бадун не отпустил. Если он писал на васике или на любом другом языке, то имеет хоть какое то представление он булевой алгебре. Во всяком случае элементарное условие смог бы собрать.
Наверняка бадун во всём виноват.
 

AlexeyVik

Программист mql4 mql5
ну да, удивлен!)):D
не только я мучаюсь оказывается с переходом...)
можешь подсказать как с реверсом написать код?)вижу светлая голова, приятно видеть умных людей на сайте...)
Если в твоих словах оставить только выделенное жирным, то будет точней сказано.
Ну а про реверс тебе уже ответили.
 

Milord

Местный знаток
Конкурс в честь Нового Года, кто напишет самый непонятный код?)

Конечно хочу, у нас Новый Год или нет?!
Код 100% рабочий, но в реале я бы не стал так делать, а написал бы как Ugar выше показал.
может тогда в честь Нового Года объявим конкурс неофициальный на самый непонятный код из 10 строк, с комментами?))):D
по типу этого(взято из инета )
PHP:
private void _1(_1 _2) 
		{ 
		  while(_2._1()) 
		  { 
		    _1 = _2._1(true); 
		    _1._1(); 
		    _1(_1); 
		   } 
		}
или вот примерчик:
PHP:
#include <iostream>
using namespace std;
 
#define ___(__) char(__)
 
int main(int _, char **____)
{
    cout << ___((_=1, _<<=6, _+0x09));
    cout << ___((_=1, _<<=5, _+0x00));
    cout << ___((_=1, _<<=6, _+0x0C));
    cout << ___((_=1, _<<=6, _+0x29));
    cout << ___((_=1, _<<=6, _+0x2B));
    cout << ___((_=1, _<<=6, _+0x25));
    cout << ___((_=1, _<<=5, _+0x00));
    cout << ___((_=1, _<<=6, _+0x03));
    cout << ___((_=1, _<<=5, _+0x0B));
    cout << ___((_=1, _<<=5, _+0x0B));
 
    return 0;
}
скажу честно - смотрю на сии перлы "яко баран на новые ворота"))):D
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
а если сделать наоборот, логика работы не изменится?
PHP:
if((Q1==1 && A>B) || (Q2==1 && C<D) || E>F)
{
OrderSend(...);
}
Изменится кардинально.
Ведь если последняя часть условия E > F будет выполнена, то первые две части условия никак не влияют на общий результат при любых значениях A, B, C, D, Q1 и Q2.
 

Ugar

Гуру форума
может тогда в честь Нового Года объявим конкурс неофициальный на самый непонятный код из 10 строк, с комментами?))):D
Конкурс? Да ещё и новогодний? А приз какой?
Что бы в новогодние праздники, программист начал напрягать мозги, приз должен быть такой, что бы увидев его программист аж протрезвел. :D
 

skyger

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

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
#property copyright "и так понятно"
#property link "конечно моё"

extern int MA1=10;
extern int MA2=15;

extern double LotTrend = 1;
extern int TP=12;
extern int SL=12;

double ExtBuffer[], S1, S2, tickB;
int A=0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{

tickB=MarketInfo(Symbol(),MODE_BID);

if ( A>250) A=0;
A++;
ExtBuffer[A]=tickB;

S1=iMAOnArray(ExtBuffer,200,MA1,0,MODE_SMA,0);
S2=iMAOnArray(ExtBuffer,200,MA2,0,MODE_SMA,0);
if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)
{
if (S1>S2)
{
OrderSend(Symbol(),OP_BUY,LotTrend,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,Green);
}
if (S1<S2)
{
OrderSend(Symbol(),OP_SELL,LotTrend,Bid,0,Bid+SL*Point,Bid-TP*Point,0,0,0,Green);
}
}



return(0);
}


//+---------------------конец фильма---------------------------------------------+
 
Последнее редактирование модератором:

Milord

Местный знаток
Надо это дело обмозговать)

Конкурс? Да ещё и новогодний? А приз какой?
Что бы в новогодние праздники, программист начал напрягать мозги, приз должен быть такой, что бы увидев его программист аж протрезвел. :D
надо раскинуть мозгами,может Юля подключится и призы выделит?)):D
 

AlexeyVik

Программист mql4 mql5
С новым годом комрады! Счастья, здоровья и регулярных профитов!
Тут на медни попытался смастерить простенькую сову на тиках дабы понять физику процесса, однако опыт оказался неудачным. Будьте так любезны наставте на путь истинный, где, чего и как я упустил, и что мне сделать чтоб он заработал.

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
#property copyright "и так понятно"
#property link "конечно моё"

extern int MA1=10;
extern int MA2=15;

extern double LotTrend = 1;
extern int TP=12;
extern int SL=12;

double ExtBuffer[], S1, S2, tickB;
int A=0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{

tickB=MarketInfo(Symbol(),MODE_BID);

if ( A>250) A=0;
A++;
ExtBuffer[A]=tickB;

S1=iMAOnArray(ExtBuffer,200,MA1,0,MODE_SMA,0);
S2=iMAOnArray(ExtBuffer,200,MA2,0,MODE_SMA,0);
if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)
{
if (S1>S2)
{
OrderSend(Symbol(),OP_BUY,LotTrend,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,Green);
}
if (S1<S2)
{
OrderSend(Symbol(),OP_SELL,LotTrend,Bid,0,Bid+SL*Point,Bid-TP*Point,0,0,0,Green);
}
}



return(0);
}


//+---------------------конец фильма---------------------------------------------+
Наверное ты плохо разобрался с массивами и iMAOnArray()

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

skyger

Прохожий
Наверное ты плохо разобрался с массивами и iMAOnArray()

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

Большое спасибо за ответ , но это внесло еще большую сумятицу в мою неокрепшую после праздников психику. Как я понимаю сначала создается массив тик[]=Bid; где идет запись тиков как и баров от свежайшего нулевого тика, который только что только поступил, до наиболее старшего-древнего, который был самым первым. Поэтому как я понял для использования ф-ции iMAOnArray() необходимо произвести инверсию подсчета или же ввести свою ф-цию расчета среднего. Дальше как я понимаю необходимо организовать цикл , ибо любой расчет средней сопровождается циклом. Ну а далее лигические условия торговли. Короче надо еще пошевелить мозгами.
 

qqmber

Почетный гражданин
Большое спасибо за ответ , но это внесло еще большую сумятицу в мою неокрепшую после праздников психику. Как я понимаю сначала создается массив тик[]=Bid; где идет запись тиков как и баров от свежайшего нулевого тика, который только что только поступил, до наиболее старшего-древнего, который был самым первым. Поэтому как я понял для использования ф-ции iMAOnArray() необходимо произвести инверсию подсчета или же ввести свою ф-цию расчета среднего. Дальше как я понимаю необходимо организовать цикл , ибо любой расчет средней сопровождается циклом. Ну а далее лигические условия торговли. Короче надо еще пошевелить мозгами.
Восстанавливай здоровье и обрати внимание, что размер массива нигде не указан, так что на самом деле ничего у тебя не создается.
Алексей ключевую идею дал, делай движущееся "окно" во времени и снимай с него средние с нужным периодом. Я бы даже не стал iMAOnArray() вызывать, проще и понятнее самому посчитать.
 

AlexeyVik

Программист mql4 mql5
Восстанавливай здоровье и обрати внимание, что размер массива нигде не указан, так что на самом деле ничего у тебя не создается.
Алексей ключевую идею дал, делай движущееся "окно" во времени и снимай с него средние с нужным периодом. Я бы даже не стал iMAOnArray() вызывать, проще и понятнее самому посчитать.
А может и зря. Функция быстрей цикла. Просто перед использованием iMAOnArray() надо поменять направление индексации. Или сделать не так как я сначала говорил. Ошибся не тщательно обдумав. Если функция iMAOnArray() работает от нулевого индекса на указанную глубину, то заполняя массив, при поступлении нового тика, все элементы массива надо сдвигать на единицу в сторону увеличения индекса, а новый тик писать в нулевой.
 

qqmber

Почетный гражданин
А может и зря. Функция быстрей цикла. Просто перед использованием iMAOnArray() надо поменять направление индексации. Или сделать не так как я сначала говорил. Ошибся не тщательно обдумав. Если функция iMAOnArray() работает от нулевого индекса на указанную глубину, то заполняя массив, при поступлении нового тика, все элементы массива надо сдвигать на единицу в сторону увеличения индекса, а новый тик писать в нулевой.

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

qqmber

Почетный гражданин
А может и зря. Функция быстрей цикла.
Тебе может понравиться принт вот этого скрипта. Брось на любой график, где есть несколько тысяч баров.
Код:
#include <stdlib.mqh>
double B[],fma[],cma[];

int start() {
int i,t;
   ArrayResize(B,Bars);
   ArrayResize(fma,Bars);
   ArrayResize(cma,Bars);
   ArraySetAsSeries(B,true);
   for(i=Bars; i>0; i--) B[i]=Close[i];

   t=GetTickCount();
   for(i=Bars; i>0; i--) c(i);
   Print ("SimpleCode exec time: ", GetTickCount()-t);

   t=GetTickCount();
   for(i=Bars; i>0; i--) f(i);
   Print ("iMAOnArray exec time: ",GetTickCount()-t);
   
   for(i=0; i<Bars; i++) {
      if(!CompareDoubles(fma[i],cma[i])) {
         Alert("Fail @",i,":",fma[i]+"!="+cma[i]);
         break;
      }
   }
}

void f(int P) {
   for(int i=Bars; i>0; i--) fma[i]=iMAOnArray(B,0,P,0,0,i);
}

void c(int P) {
   for(int i=Bars; i>0; i--) cma[i]=cma[i+1]+(B[i]-B[i+P])/P;
}
 

Ugar

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

skyger

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

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

double TickSMA(double array[],int per)
{
double Sum = 0;
for(int i = 0;i < per;i++) Sum += array;
return(Sum/per);
}
думаю подойдет. Или вы имели , что более продвинутое? Сложнее я пока не потяну мозгами, пока.
 

Milord

Местный знаток
Тебе может понравиться принт вот этого скрипта. Брось на любой график, где есть несколько тысяч баров.
Код:
#include <stdlib.mqh>
double B[],fma[],cma[];

int start() {
int i,t;
   ArrayResize(B,Bars);
   ArrayResize(fma,Bars);
   ArrayResize(cma,Bars);
   ArraySetAsSeries(B,true);
   for(i=Bars; i>0; i--) B[i]=Close[i];

   t=GetTickCount();
   for(i=Bars; i>0; i--) c(i);
   Print ("SimpleCode exec time: ", GetTickCount()-t);

   t=GetTickCount();
   for(i=Bars; i>0; i--) f(i);
   Print ("iMAOnArray exec time: ",GetTickCount()-t);
   
   for(i=0; i<Bars; i++) {
      if(!CompareDoubles(fma[i],cma[i])) {
         Alert("Fail @",i,":",fma[i]+"!="+cma[i]);
         break;
      }
   }
}

void f(int P) {
   for(int i=Bars; i>0; i--) fma[i]=iMAOnArray(B,0,P,0,0,i);
}

void c(int P) {
   for(int i=Bars; i>0; i--) cma[i]=cma[i+1]+(B[i]-B[i+P])/P;
}
что скрипт делает, если в кратце???

P.S. - ВСЕХ С НОВЫМ ГОДОМ!!!
 
Последнее редактирование:
Верх