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

Leonup

Новичок форума
А легко. Буду писать чтоб проще так:

PHP:
IsCrossed()
{
    int cnt; // Создаём счётчик
   
    // Тело функции
    for (i=Bars-1; i>=0; i--)
    {
        if (машки пересеклись)
        {
            // Можно выполнить какое-то условие...
            cnt++; // А тут инкремент к счётчику, т.е. значение cnt
                       //.. увеличится на 1
         } 
    }
}

Тут получается что будет проход по всем барам в истории и прибавлять к счётчику 1, если на каком-то баре есть пересечение.

Набросал скриптец, который рисует палки в местах выполнения твоего условия. Так надо?
Код:
int tx(int i0, int j, int k, int k_price) {
double jma0,kma0,jma1,kma1;

   for(int i=i0; i>0; i--) {
      jma0=iMA(NULL,0,j,0,0,0,i);
      kma0=iMA(NULL,0,k,0,0,k_price,i);
      jma1=iMA(NULL,0,j,0,0,0,i+1);
      kma1=iMA(NULL,0,k,0,0,k_price,i+1);
      if(jma0-kma0 > 0 && jma1-kma1 <=0) return(i);
   }
   return(-1);     
}

int start() {
int t5x11,t5x21,t5x31;

   for(int start=WindowFirstVisibleBar(); start>0; start=t5x11-1) {
      t5x31=tx(start,5,31,PRICE_LOW); 
      t5x21=tx(t5x31,5,21,PRICE_CLOSE);
      t5x11=tx(t5x21,5,11,PRICE_HIGH);
      if(t5x11>0) ObjectCreate(""+t5x11,0,0,Time[t5x11],0,0,0);      
   }
}


Огромное Вам спасибо! Применю.
 

hoz

Активный участник
Есть заголовочный файл [email protected]. Он использует различные библиотеки, в том числе и [email protected].
Вот так импортирую функцию библиотеки [email protected]:

PHP:
#import "[email protected]"
    void fPrint (string& fs_Text);
#import
#import "hoz_HandlingWithErrorS.ex4"
    string fErrorToString(int fi_Error);
    string fErrorDescription (int fi_Error);
#import


При компиляции самой библиотеки [email protected] компилятор ругается:

PHP:
'StringConcatenate' - incompatible types	D:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\include\[email protected] (75, 12)


Открываю строку ошибки:

PHP:
fPrint (StringConcatenate ("fInitBase() => ", fErrorToString (bi_Err)));


Чего он упёрся то? Что ему нужно? Тип и параметры библиотечной функции я передал канкретно. Чего она с типами то не нравится?

Сама функция с которой непонятки вот:

PHP:
void fPrint (string& fs_Text)          // Возвращаемая пустая строка
{
    if (StringLen (fs_Text) > 0)
    {
        if (bs_LibName != "") fs_Text = StringConcatenate (bs_LibName, " => ", fs_Text);

        if (bb_PrintPermission)
            Print (fs_Text);

        if (bb_CommentPermission)
            Comment (fs_Text);
    }
    //---- Очищаем переменную
    fs_Text = "";
//---- 
    return;
}

// ================================================================== //

В общем, вот так если сделать, то всё работает нормально:

PHP:
string m = StringConcatenate ("fInitBase() => ", fErrorToString (bi_Err));
   fPrint (m);


Но так мне не нравится. Растягивание каждой подобной операции в коде. Как этого избежать?
 
Последнее редактирование:

hoz

Активный участник
Покажи 70-80 строки этого файла.

Так компилируется щяс, но мне не нравится такой вариант:

PHP:
void fInitBase()
{
//   fInitTrade();
   if (bd_SymPoint == 0.0)
       {bd_SymPoint = fGet_Point(Symbol());}
   fGet_MarketInfo (Symbol(), -1);
   bi_LotPrecision = fLotPrecision ();
   bd_MINLOT = MarketInfo(Symbol(), MODE_MINLOT);
   bd_MAXLOT = MarketInfo(Symbol(), MODE_MAXLOT);
   bd_LOTSTEP = MarketInfo(Symbol(), MODE_LOTSTEP);
   bb_RealTrade = (!IsTesting() && !IsOptimization());
   bb_VirtualTrade = (IsOptimization() || (IsTesting() && !IsVisualMode()));
   bi_Err = GetLastError();
   //---- Контролируем возможные ошибки
   string m = StringConcatenate ("fInitBase() => ", fErrorToString (bi_Err));
   fPrint (m);


А было когда писал так:

PHP:
void fInitBase()
{
//   fInitTrade();
   if (bd_SymPoint == 0.0)
       {bd_SymPoint = fGet_Point(Symbol());}
   fGet_MarketInfo (Symbol(), -1);
   bi_LotPrecision = fLotPrecision ();
   bd_MINLOT = MarketInfo(Symbol(), MODE_MINLOT);
   bd_MAXLOT = MarketInfo(Symbol(), MODE_MAXLOT);
   bd_LOTSTEP = MarketInfo(Symbol(), MODE_LOTSTEP);
   bb_RealTrade = (!IsTesting() && !IsOptimization());
   bb_VirtualTrade = (IsOptimization() || (IsTesting() && !IsVisualMode()));
   bi_Err = GetLastError();
   //---- Контролируем возможные ошибки
   fPrint (StringConcatenate ("fInitBase() => ", fErrorToString (bi_Err)));
 

qqmber

Почетный гражданин
Так компилируется щяс, но мне не нравится такой вариант:
Понял.
Значение, возвращаемое функцией, нельзя передавать ссылкой, только значением. Попробуй string& -> string в fPrint() или терпи временную переменную.
 

hoz

Активный участник
Я тока что это понял. Придётся данную функцию по ходу в заголовочном файла вписать. Иначе никак. Документация говорит, что так.
Опять таки, ущербность языка. Казалось бы, функция относится к какой-то библиотеке, а её туда поместить нельзя:angry:
 

hoz

Активный участник
Ну-ну! Я бы послушал, так что продолжайте плз! :)


Если желание не отпало, то можно продолжить. Только приготовьтесь столкнуться с граблями сразу. Вот что я спрашивал, нада сразу догнать как обойти.
Я понимаю, что можно вместо библиотек всё писать в инклюдах, но как-то не хочется так. Хочу отдельными компилируемыми файлами. А в данном случае нельзя передавать параметры по ссылке. В общем, вот такая вот хрень. Писал я библиотеки почти неделю, и щяс вот вообще головняк вышел, озадачило меня. Получается, что всё то, что я разгруппировал по отдельным библиотеками, придётся либо паковать в одну, либо в заголовочный файл всё помещать. А это не особо удобно.
Может ещё варианты есть?
А дальше, уже появится вариант с наиболее адекватной реализацией списка инструментов:tshh:
 

qqmber

Почетный гражданин
Если желание не отпало, то можно продолжить. Только приготовьтесь столкнуться с граблями сразу. Вот что я спрашивал, нада сразу догнать как обойти.
Я понимаю, что можно вместо библиотек всё писать в инклюдах, но как-то не хочется так. Хочу отдельными компилируемыми файлами. А в данном случае нельзя передавать параметры по ссылке. В общем, вот такая вот хрень. Писал я библиотеки почти неделю, и щяс вот вообще головняк вышел, озадачило меня. Получается, что всё то, что я разгруппировал по отдельным библиотеками, придётся либо паковать в одну, либо в заголовочный файл всё помещать. А это не особо удобно.
Может ещё варианты есть?
А дальше, уже появится вариант с наиболее адекватной реализацией списка инструментов:tshh:

Так, давай помедленнее.
Во-первых, не вижу причин огорчаться, ну не передает ссылку, передавай значение, тебе что за печаль? Убери & и будет все работать. Ты же не собираешься внутри принта массивы модифицировать, не?
Во-вторых, нормальная ситуация это когда код в библиотеке а описания его в заголовочном файле. Если так и сделано, ОК, но ты опять тут про передачу по ссылке говоришь. Какая связь?
 

hoz

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

Там задумка другая. Если в вызывающей функции есть переменная и она при каком-то условии принимает некоторое значение, то дальше по коду, если она вызывается, то у неё будет другое значение. А в другом условие, например, не нужно "тянуть" то что было принято пару шагов назад. Вот типа так:

PHP:
void Function()
{
    string fName = "строковое значение";

    if (некое условие1)
    {
         fName = fName + "строковое значение, которое пришло с условием";
         fPrint (StringConcatenate ("fInitBase() => ",  fName));
    }
    
    if (некое условие2)
    {
         fName = fName + "другое условие, (предыдущее нам уже не нужно)";
         fPrint (StringConcatenate ("fInitBase() => ",  fName));
     }
}


Ну вот грубо говоря так. Можно, конечно, внутри вызывающей функции что-то делать, но задумка было не явно.
 

hoz

Активный участник
Во-первых, не вижу причин огорчаться, ну не передает ссылку, передавай значение, тебе что за печаль?


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

Во-вторых, нормальная ситуация это когда код в библиотеке а описания его в заголовочном файле. Если так и сделано, ОК, но ты опять тут про передачу по ссылке говоришь. Какая связь?


Сделано именно так. А про передачу по ссылке говоря, т.к. импортировать функции, у которых параметром выступает массив передающий значение по ссылке, из библиотек нельзя. Вот в чём суть. Тогда получается, что такие функции в библиотеках держать нельзя, а работать они исправно будут только, если их "держать" в самих же заголовочных файлах. Вот это хреново. Я понятно излагаюсь?
 

qqmber

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

Сделано именно так. А про передачу по ссылке говоря, т.к. импортировать функции, у которых параметром выступает массив передающий значение по ссылке, из библиотек нельзя. Вот в чём суть. Тогда получается, что такие функции в библиотеках держать нельзя, а работать они исправно будут только, если их "держать" в самих же заголовочных файлах. Вот это хреново. Я понятно излагаюсь?
Не вполне понятно, но это я туплю, видимо.
Вот чего нельзя сделать, это отдать в библиотечную функцию строку или массив ссылкой, чтобы внутри функции строку эту изменить. Можно отдать строку значением, как и делается в большинстве случаев, с библиотеками или без. В частности, всем вариантам Print-a можно и нужно отдавать строки значением, а не ссылкой, и пусть он там свою копию строки принтует.
 

hoz

Активный участник
Там задумка другая. Если в вызывающей функции есть переменная и она при каком-то условии принимает некоторое значение, то дальше по коду, если она вызывается, то у неё будет другое значение. А в другом условие, например, не нужно "тянуть" то что было принято пару шагов назад. Вот типа так:

PHP:
void Function()
{
    string fName = "строковое значение";

    if (некое условие1)
    {
         fName = fName + "строковое значение, которое пришло с условием";
         fPrint (StringConcatenate ("fInitBase() => ",  fName));
    }
    
    if (некое условие2)
    {
         fName = fName + "другое условие, (предыдущее нам уже не нужно)";
         fPrint (StringConcatenate ("fInitBase() => ",  fName));
     }
}


Ну вот грубо говоря так. Можно, конечно, внутри вызывающей функции что-то делать, но задумка было не явно.


Тут я сам не верно изложил мысль. Имелось в виду так:

PHP:
void Function()
{
    string fName = "строковое значение";

    if (некое условие1)
    {
         fName = fName + "строковое значение, которое пришло с условием";
         fPrint (StringConcatenate ("fInitBase() => ",  fName));
    }
    
    if (некое условие2)
    {
         fName = fName + "другое условие, (предыдущее нам уже не нужно)";
         fPrint (StringConcatenate ("fInitBase() => ",  fName));
     }
    fPrint (StringConcatenate ("fInitBase() => ",  fName/*что-то ещё*/));
}

В зависимости от условия fName принимает значение какое-то. Потом в любом случает отработает функция fPrint() и там переменную fName если не обнулить, то она будет уже иметь какое-то значение. А хорошо бы, чтоб была возможность обнулять, т.е. с неё же возвращать пустое значение!
 
Последнее редактирование модератором:

hoz

Активный участник
Не вполне понятно, но это я туплю, видимо.
Вот чего нельзя сделать, это отдать в библиотечную функцию строку или массив ссылкой, чтобы внутри функции строку эту изменить. Можно отдать строку значением, как и делается в большинстве случаев, с библиотеками или без. В частности, всем вариантам Print-a можно и нужно отдавать строки значением, а не ссылкой, и пусть он там свою копию строки принтует.


Ну давай на примере. Есть заголовочный файл Base.mqh
Есть библиотека Base.mq4(которая есс-но компилируется в Base.ex4)

В библиотеке есть функция:
PHP:
void InitializeArray_STR (string& fsa_Array[], string fs_Value = "")
{
    for (int li_int = 0; li_int < ArraySize (fsa_Array); li_int++)
    {
        fsa_Array[li_int] = fs_Value;
    }
}


Массив fsa_Array[] инициализируется заданным значением и возвращается по ссылке. Сами функции в mql4 возвращать могут только вещественные и булевые значения. Массивы нельзя. Для этого то тут и есть необходимость передать по ссылке массив fsa_Array[].
Если так нельзя, а так нельзя, то как это обойти?
Создать пачку временных массивов в заголовочном файле и полученное значение в функции передавать в те временные массивы? Другого варианта типа нет?

ВОПРОС СНИМАЮ. НЕЛЬЗЯ ПЕРЕДАВАТЬ ПО ССЫЛКЕ ЭЛЕМЕНТЫ МАССИВОВ, А МАССИВЫ МОЖНО.
 
Последнее редактирование:

gzh

Интересующийся
Господа программисты, помогите пожалуйста с кодом, никак не получается. Я новичок в программировании, только учусь. Хочу написать простой советник по фракталам: появился нижний фрактал - Buy, появился верхний фрактал - Sell.
Подскажите, что не правильно, как правильно. Буду благодарен!!

for (int i=0; i<OrdersTotal(); i++) {
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if (OrderType()==1 && Close[2] < Close[3] && Close[1] > Close[2]) OrderClose(OrderTicket(),OrderLots(),Ask,0);

if (OrderType()==0 && Close[2] > Close[3] && Close[1] < Close[2]) OrderClose(OrderTicket(),OrderLots(),Bid,0); }


if (OrdersTotal()==0) {

if (Close[2] < Close[3] && Close[1] > Close[2]) OrderSend(Symbol(),0,lot,Ask,0,0,0);

if (Close[2] > Close[3] && Close[1] < Close[2]) OrderSend(Symbol(),1,lot,Bid,0,0,0); }
 

gzh

Интересующийся
Господа программисты, помогите пожалуйста с кодом, никак не получается. Я новичок в программировании, только учусь. Хочу написать простой советник по фракталам: появился нижний фрактал - Buy, появился верхний фрактал - Sell.
Подскажите, что не правильно, как правильно. Буду благодарен!!!

for (int i=0; i<OrdersTotal(); i++) {
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if (OrderType()==1 && Close[2] < Close[3] && Close[1] > Close[2]) OrderClose(OrderTicket(),OrderLots(),Ask,0);

if (OrderType()==0 && Close[2] > Close[3] && Close[1] < Close[2]) OrderClose(OrderTicket(),OrderLots(),Bid,0); }


if (OrdersTotal()==0) {

if (Close[2] < Close[3] && Close[1] > Close[2]) OrderSend(Symbol(),0,lot,Ask,0,0,0);

if (Close[2] > Close[3] && Close[1] < Close[2]) OrderSend(Symbol(),1,lot,Bid,0,0,0); }
 

ansol

Местный знаток
Фрактал вычисляется так:
PHP:
double iFractals( string symbol, int timeframe, int mode, int shift) 
Расчет индикатора Fractals.
А вы тут какую-то свечную комбинацию высматриваете :)
 
Верх