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

egor008

Активный участник
Я скорее всего, не совсем ясно, объяснил. Это самое трудное, соединить объяснение с пониманием. И если получится, то Ура!!!

Я старался как мог, и попробую ещё, сколько нужно раз..

Немножко дописал, вывод текста, чтобы понятней было.

PHP:
 txt=  "  max    " +  DoubleToString(array[i],_Digits)+"      min      "+DoubleToString(vzad[i],_Digits)+ "    index  "  +  (string)i +"   "  + "\n";

При наличии, четырёх открытых позиций, индекс "i" показывает 3.

Это значит что массив vzad показывает открытую позицию с самой минимальной ценой, не на нулевом индексе а на третьем, то есть на четвёртой открытой позиции.

Так:

vzad[0]
vzad[1]
vzad[2]
vzad[3] <--- тут

Оранжевая стрелка, на картинке показывает индекс 3.

6.jpg

Но это уже, и так есть. В коде, 58 строка, массив pri[10]; На картинке: Верхняя белая стрелка "min" индекс 6. (самая минимальная по цене, открытая позиция).
Нижняя белая стрелка "max" индекс 9. (самая максимальная по цене, открытая позиция)
----------------------------------------------

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

5.jpg
--------------------------------------------------------------------

Следующая картинка с примером. Работающий пример. В коде 57 строка. Массив poz[10];

От САМОЙ ВЫСОКОЙ ОТКРЫТОЙ ПОЗИЦИИ до НИЖНЕЙ ОТКРЫТОЙ ПОЗИЦИИ. ЧЕТВЁРТАЯ ПО ВЫСОТЕ - это и есть, самая нижняя открытая позиция (*в примере).

8.jpg


Возможно ли сделать тоже самое, только зеркально, наоборот?

От САМОЙ НИЗКОЙ ОТКРЫТОЙ ПОЗИЦИИ до ВЫСОКОЙ ОТКРЫТОЙ ПОЗИЦИИ

Надеюсь сейчас, более понятней объяснил..:);)


п.с.
Пузырьковая сортировка, не спасла.
Сортировка выбором, не подошла.
ArrayCopy, тоже не получилось.

Вот бы, индексы перевернуть, но не умею, как..:rolleyes:

 
Последнее редактирование:

AlexeNP

Гуру форума
Я скорее всего, не совсем ясно, объяснил. Это самое трудное, соединить объяснение с пониманием. И если получится, то Ура!!!

Я старался как мог, и попробую ещё, сколько нужно раз..

Немножко дописал, вывод текста, чтобы понятней было.

PHP:
 txt=  "  max    " +  DoubleToString(array[i],_Digits)+"      min      "+DoubleToString(vzad[i],_Digits)+ "    index  "  +  (string)i +"   "  + "\n";

При наличии, четырёх открытых позиций, индекс "i" показывает 3.

Это значит что массив vzad показывает открытую позицию с самой минимальной ценой, не на нулевом индексе а на третьем, то есть на четвёртой открытой позиции.

Так:

vzad[0]
vzad[1]
vzad[2]
vzad[3] <--- тут

Оранжевая стрелка, на картинке показывает индекс 3.

Посмотреть вложение 474837

Но это уже, и так есть. В коде, 58 строка, массив pri[10]; На картинке: Верхняя белая стрелка "min" индекс 6. (самая минимальная по цене, открытая позиция).
Нижняя белая стрелка "max" индекс 9. (самая максимальная по цене, открытая позиция)
----------------------------------------------

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

Посмотреть вложение 474838
--------------------------------------------------------------------

Следующая картинка с примером. Работающий пример. В коде 57 строка. Массив poz[10];

От САМОЙ ВЫСОКОЙ ОТКРЫТОЙ ПОЗИЦИИ до НИЖНЕЙ ОТКРЫТОЙ ПОЗИЦИИ. ЧЕТВЁРТАЯ ПО ВЫСОТЕ - это и есть, самая нижняя открытая позиция (*в примере).

Посмотреть вложение 474840


Возможно ли сделать тоже самое, только зеркально, наоборот?

От САМОЙ НИЗКОЙ ОТКРЫТОЙ ПОЗИЦИИ до ВЫСОКОЙ ОТКРЫТОЙ ПОЗИЦИИ

Надеюсь сейчас, более понятней объяснил..:);)


п.с.
Пузырьковая сортировка, не спасла.
Сортировка выбором, не подошла.
ArrayCopy, тоже не получилось.

Вот бы, индексы перевернуть, но не умею, как..:rolleyes:

хз чего тебе нужно, но ArraySort - сортирует массив по возрастанию (по умолчанию) без всяких пузырьков. Массив должен быть динамическим - не задавай ему заранее размер, а увеличивай по мере необходимости... тогда, сортируешь массив - получаешь значения по возрастанию, а читая его в обратном порядке - по убыванию
 

egor008

Активный участник
хз чего тебе нужно, но ArraySort - сортирует массив по возрастанию (по умолчанию) без всяких пузырьков. Массив должен быть динамическим - не задавай ему заранее размер, а увеличивай по мере необходимости... тогда, сортируешь массив - получаешь значения по возрастанию, а читая его в обратном порядке - по убыванию
Завтра буду думать, как ещё это можно объяснить..
 

vitto.mq4

Местный знаток
Ну тогда как-то так:
Код:
enum RiskCalc{AccountBalance,AccountEquity,AccountFreeMargin};

extern double   FixedLots      = 0.01;            // Lot Size:
extern bool     PropotinalLots = false;           // Money Management:
extern RiskCalc RiskType       = AccountBalance;  // Risk Calculate Type:
extern double   PercentLots    = 0.01;            // Risk %

double Lots,risk;
int    DigitLot=0;

//————————————————————————————————————————————————————————|

int OnInit()
{
   if(MarketInfo(Symbol(),MODE_LOTSTEP)>= 0.01) DigitLot=2;
   if(MarketInfo(Symbol(),MODE_LOTSTEP)>= 0.1) DigitLot=1;
   if(MarketInfo(Symbol(),MODE_LOTSTEP)>= 1)  DigitLot=0;

   return(INIT_SUCCEEDED);
}

//———————————————————————————————————————————————————————————|

void LotsSize()
{                                            Lots = FixedLots;
   if(RiskType == AccountEquity)            {risk = AccountEquity();}
   if(RiskType == AccountBalance)           {risk = AccountBalance();}
   if(RiskType == AccountFreeMargin)        {risk = AccountFreeMargin();}
   if(Lots<MarketInfo(Symbol(),MODE_MINLOT)) Lots = MarketInfo(Symbol(),MODE_MINLOT);
   if(Lots>MarketInfo(Symbol(),MODE_MAXLOT)) Lots = MarketInfo(Symbol(),MODE_MAXLOT);
   if(PropotinalLots){Lots = NormalizeDouble(risk * PercentLots/100.0,  DigitLot);}
}

//————————————————————————————————————————————————————————————————————————————————|

void OnTick()
{

   LotsSize();


   if(CheckMoneyForTrade(_Symbol,Lots,OP_BUY)&& ...условия для покупки)
   {
      // Ордер на покупку
   }


   if(CheckMoneyForTrade(_Symbol,Lots,OP_SELL)&& ...условия для продажи)
   {
      // Ордер на продажу
   }

}

//————————————————————————————————————————————————————————|

bool CheckMoneyForTrade(string symb, double lots, int type)
{
   double free_margin=AccountFreeMarginCheck(symb,type,lots);

   if(free_margin<0)
   {
      string oper =(type==OP_BUY)? "Buy":"Sell";
      Print("Not enough money for ",oper," ",lots," ",symb," Error code=",GetLastError());
      return(false);
   }
   return(true);
}
Ну тогда выдает 20 ошибок и 16 предупреждений ;)
 
Последнее редактирование:

egor008

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

Как ещё объяснить, пока не знаю..

В общем. Нижний массив, не всегда, работает правильно.

Поэтому ищу помощи. Что бы исправить его.

И отвечая на ваш вопрос - хз чего тебе нужно,

Мне нужно, что бы не один, а оба массива, работали правильно. :)

Вот чего мне нужно.

01.jpg02.jpg03.jpg04.jpg05.jpg06.jpg07.jpg
 

egor008

Активный участник
Ну тогда выдает 20 ошибок и 16 предупреждений ;)
42-ая строка Из-за этого: "&& ...условия для покупки"
48-ая строка Из-за этого: "&& ...условия для продажи"

Нужно убрать, то что указал в кавычках.


Или дописать условие, например так:

Вместо этого: "...условия для покупки" это условие: Close[1] > Close[2]
Вместо этого: "...условия для продажи" это условие: Close[1] < Close[2]

п.с.

Повнимательней.. и Аккуратней со скобками, их трогать нельзя..)):oops:
 

AlexeNP

Гуру форума
Вот скрины сделал. На которых, надеюсь получится рассмотреть, как меняются значения в массивах, при открытии новой позиции.

Как ещё объяснить, пока не знаю..

В общем. Нижний массив, не всегда, работает правильно.

Поэтому ищу помощи. Что бы исправить его.

И отвечая на ваш вопрос - хз чего тебе нужно,

Мне нужно, что бы не один, а оба массива, работали правильно. :)

Вот чего мне нужно.

 

Вложения

  • test_сортировка_массива.mq4
    4,8 КБ · Просмотры: 13

vitto.mq4

Местный знаток
42-ая строка Из-за этого: "&& ...условия для покупки"
48-ая строка Из-за этого: "&& ...условия для продажи"

Нужно убрать, то что указал в кавычках.


Или дописать условие, например так:

Вместо этого: "...условия для покупки" это условие: Close[1] > Close[2]
Вместо этого: "...условия для продажи" это условие: Close[1] < Close[2]

п.с.

Повнимательней.. и Аккуратней со скобками, их трогать нельзя..)):oops:
20 ошибок 10 предупреждений...
 

egor008

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

п.с.
Раньше не мог ответить. Радовался очень. ))

Спасибо ещё раз!
 

ZNV

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


C-подобный:
   input int USDJPY_5 = 50;
.....
.......
........
void start()
{
            string j = IntegerToString(TF[u],0);            // это 5

            j = usdjpy[i] + "_" + j;

            int A = (int)StringToInteger(j);
}

не определяется. Определяет как число как USDJPY_5 а не как 50...

может как то еще можно...?

хелп :(
 

mobidik

-----
Пытаюсь задать константу, а потом ее в программе пересобрать...


C-подобный:
   input int USDJPY_5 = 50;
.....
.......
........
void start()
{
            string j = IntegerToString(TF[u],0);            // это 5

            j = usdjpy[i] + "_" + j;

            int A = (int)StringToInteger(j);
}

не определяется. Определяет как число как USDJPY_5 а не как 50...

может как то еще можно...?

хелп :(
Разделителем в тексте является нижнее подчеркивание ("_") - вот его позицию и нужно найти.
Могу предложить два варианта:
1) Если в тексте заранее известно, что будет только один разделитель, тогда удобнее, как по мне, воспользоваться ф-цией: StringFind() - найдем позицию разделителя в заданной строке, а затем, с помощью ф-ции StringSubstr() извлечем текст от ранее найденной позиции разделителя:
C-подобный:
   int k = StringFind(j,"_",0)+1;
   int A1 = StrToInteger(StringSubstr(j,k));
  
   Print(" A1 = ",A1);
2) Если нам не известно заранее сколько будет разделителей в тексте или их более одного, тогда удобнее через массив. Задаем сам массив: result[]. Определяем код разделителя "_" - ф-ция StringGetCharacter(), затем используем ф-цию StringSplit():
C-подобный:
   string result[];               // массив для получения строк
 
   int k2 = StringSplit(j,StringGetCharacter("_",0),result);
   int A2 = StrToInteger(result[k2-1]);
  
   Print(" A2 = ",A2);
 
  • Like
Реакции: ZNV

star603

Новичок форума
Код:
void Sl1()//Стоп уровни по лоу свечам
  {
   uo(svecha);
   double dert [32];
   for(int i = 0; i<31; i++)
     {
      dert[i] = svecha[3][i];
     }
   int R = ArrayMinimum(dert,31,0);
   Print("Index=",R,"----Znach=",dert[R]);
   double R1 = NormalizeDouble(dert[R],Digits);// Здесь локализуется ошибка
   for(int re =0; re<=OrdersTotal()-1; re++)
     {
      if(OrderSelect(re,SELECT_BY_POS,MODE_TRADES)== true)
        {
         if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol())
           {
            if(OrderType() == OP_BUY)
              {
               if(R1>Bid)
                  Comment("Тогда стоплос берем ниже бида");
              }
            if(OrderType() == OP_SELL)
              {
               if(R1<Ask)
                  Comment("Тогда стоплос берем выше аска");
              }
           }
        }
     }
  };
Сам код работает только ошибка в этом(сейчас):
possible use of uninitialized variable 'dert' Umr.mq4 335 16
 

AlexeNP

Гуру форума
Код:
void Sl1()//Стоп уровни по лоу свечам
  {
   uo(svecha);
   double dert [32];
   for(int i = 0; i<31; i++)
     {
      dert[i] = svecha[3][i];
     }
   int R = ArrayMinimum(dert,31,0);
   Print("Index=",R,"----Znach=",dert[R]);
   double R1 = NormalizeDouble(dert[R],Digits);// Здесь локализуется ошибка
   for(int re =0; re<=OrdersTotal()-1; re++)
     {
      if(OrderSelect(re,SELECT_BY_POS,MODE_TRADES)== true)
        {
         if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol())
           {
            if(OrderType() == OP_BUY)
              {
               if(R1>Bid)
                  Comment("Тогда стоплос берем ниже бида");
              }
            if(OrderType() == OP_SELL)
              {
               if(R1<Ask)
                  Comment("Тогда стоплос берем выше аска");
              }
           }
        }
     }
  };
Сам код работает только ошибка в этом(сейчас):
possible use of uninitialized variable 'dert' Umr.mq4 335 16
массив dert нужно какими-нибудь числами заполнить, и
int ArrayMinimum(
const void& array[], // массив для поиска
int start=0, // с какого индекса начинаем поиск
int count=WHOLE_ARRAY // количество проверяемых
);
 
Последнее редактирование:

star603

Новичок форума
массив dert нужно какими-нибудь числами заполнить, и
int ArrayMinimum(
const void& array[], // массив для поиска
int start=0, // с какого индекса начинаем поиск
int count=WHOLE_ARRAY // количество проверяемых
);
Так массив dert заполняется вот здесь
Код:
  double dert [32];
   for(int i = 0; i<31; i++)
     {
      dert[i] = svecha[3][i];
     }
а массив svecha[3]; данных уже заполнен с помощью пользовательсной функции которая уже есть в коде.

Код:
   uo(svecha);
   double dert [32];
   for(int i = 0; i<31; i++)
     {
      dert[i] = svecha[3][i];
     }
   int R = ArrayMinimum(dert,31,0);
   Print("Index=",R,"----Znach=",dert[R]);

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

Я пока неочень понял куда ваш участок кода в мой вставить.
Я думаю вот эту часть убать вообще:
Код:
 double R1 = NormalizeDouble(dert[R],Digits);
а вместо R1 вставить вашу запись:
Код:
int ArrayMinimum(const void& dert[32],0,WHOLE_ARRAY);
но встает вопрос: мне нужно будет в последтвии возвращать значение дабл а не целое инт. Но это я еще продумаю как это сделать
 

el_Venso

Активный участник
Добрый день.
Подскажите как указать цвет в цифрах, к примеру -

extern color EurColor = 50,50,50;

Ругается, непонраву ему.
 

ZNV

Активный участник
Можно ли присвоить переменной математический знак ( < ) и чтобы он был не string?
И как его потом можно использовать в уравнении типа if( x1<x2 ){.... ?
Спасибо.

ps: смысл в том что бы в условии через input задать знак > или < для использования в формуле.
 
Последнее редактирование:

mobidik

-----
Можно ли присвоить переменной математический знак ( < ) и чтобы он был не string?
И как его потом можно использовать в уравнении типа if( x1<x2 ){.... ?
Спасибо.

ps: смысл в том что бы в условии через input задать знак > или < для использования в формуле.
Присвоить то можно, но использовать не получится. Да и зачем делать через одно место, когда можно просто задать условие:
C-подобный:
    if(Znak==">")
     {
     .....
     }else{
     .....
     }
 

ZNV

Активный участник
Присвоить то можно, но использовать не получится. Да и зачем делать через одно место, когда можно просто задать условие:
C-подобный:
    if(Znak==">")
     {
     .....
     }else{
     .....
     }
Условий получиться слишком много.
У меня 4 формулы. И код разрастается до х8 раз... хочу по человечески сделать...

А как, если присвоить можно? И почему тогда использовать не получиться? 0_О
 
Верх