Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 814

 

Как организовать массив типа int на 1 млрд. значений и затем провести его сортировку? Приведите, пожалуйста, пример.

Пока что стандартными средствами MQL4 я могу организовать массив чисел int размером всего лишь 2 млн значений.

 
solandr:

Как организовать массив типа int на 1 млрд. значений и затем провести его сортировку? Приведите, пожалуйста, пример.

Пока что стандартными средствами MQL4 я могу организовать массив чисел int размером всего лишь 2 млн значений.

Хорошее желание. Прошу Вас сосчитать размер необходимой памяти
 
Vinin:
Хорошее желание. Прошу Вас сосчитать размер необходимой памяти
Проблема понятна. Но как её решить? Существуют ли какие-либо иные способы, кроме как прямого создания массива? То есть каким образом отсортировать 1 млрд значений? Или в MQL4 невозможно придумать какое-то решение?
 
evillive:

Конечно же не верно, хотя компилятор исправит, но кто знает, правильно он исправит или нет? Может подставить ==, а может и !=, а может и вовсе не исправит, а просто проверку проигнорирует и выставит всегда истину.

Скомпилируйте код с #property strict, там ещё много чего править надо.

Если нужно проверить пересечение 2-х МА, то это не равенством проверяется, критерий должен быть вроде "если МА1(2)<MA(2) и MA1(1)>MA(1) - то вторая МА пересекла первую МА вверх на предыдущей свече". А равенство можно год ждать.

 И что такое while(true), по-вашему?

Далее:


while(true) - цикл, где подхватываю тренд:  

-если ордер пробивается по стопу (Time>0) я выставляю его на то же место где он был;

- а если дорастает до определенного уровня(NormalizeDouble(OrderOpenPrice()+TP*Point,Digits)<=NormalizeDouble(Ask,Digits)), то переходит в другой цикл (в котором условие - тип ордера), где происходит вычисления профита в пунктах и в зависимости от этого модифицируется.

 

Насчет условия  ""если МА1(2)<MA(2) и MA1(1)>MA(1) - то вторая МА пересекла первую МА вверх на предыдущей свече"" , цифры в скобках означают свечи? Вот мой вариант MA>Open[0] || MA<Open[0], пойдет?

#property strict прописал, исправил  ошибки.  

Изменил способ получения профита в пунктах теперь: полученную разницу между текущей ценой и ценой открытия я стал делить на Point(строка 217 и 271). 

Сделал преобразования типов в строках: 218, 272, 369. Верно?

Появились 2 ошибки:

possible use of uninitialized variable 'Prof' Test3.mq4 222 15

possible use of uninitialized variable 'Prof' Test3.mq4 275 15

Файлы:
test3_6.mq4  15 kb
 

Уважаемые знатоки...недавно начал познавать азы mql4...у меня к вам вопрос...допустим у меня есть основной индикатор и фильтры...если выполняется одно условие на основном инди, то с ним должны совпадать определенные условия с фильтров, если же на основном инди выполняется другое условие, то у фильтров должны выполняется другие условия...мне это нужно для открытия сделки...Могу ли я использовать в данной ситуации знак || или все же не могу...любой ответ прошу доступно пояснить, так как еще дуб дубом...С уважением! 

 
kempo102938:

Уважаемые знатоки...недавно начал познавать азы mql4...у меня к вам вопрос...допустим у меня есть основной индикатор и фильтры...если выполняется одно условие на основном инди, то с ним должны совпадать определенные условия с фильтров, если же на основном инди выполняется другое условие, то у фильтров должны выполняется другие условия...мне это нужно для открытия сделки...Могу ли я использовать в данной ситуации знак || или все же не могу...любой ответ прошу доступно пояснить, так как еще дуб дубом...С уважением! 

Определитесь. Вам нужен "И" или "ИЛИ". 
 
тааак....основной индикатор показывает столбики диаграммы 5 разных цветов (зеленый, синий, красный, оранжевый, серый). Сделка на продажу: Основной инди показывает серый столбик-->фильтры показывают свои сигналы-->открывается сделка. Если основной инди показывает оранжевый столбик-->фильтры показывают другие сигналы....и т д. Как мне правильно прописать в коде, чтобы сделки не повторялись, т к с каждой свечой цвет основного инди может прыгать "туда-сюда"...надеюсь объяснил доходчиво проблему...С уважением! 
 
CJIeCaPb:

while(true) - цикл, где подхватываю тренд: 

И когда, по-вашему, должен закрыться этот вот цикл

if(R==0)
{
 while(true)
 {
  Sleep(30000);
  Alert("Ошибка!");
 }
}

?

CJIeCaPb:

Насчет условия  ""если МА1(2)<MA(2) и MA1(1)>MA(1) - то вторая МА пересекла первую МА вверх на предыдущей свече"" , цифры в скобках означают свечи? Вот мой вариант MA>Open[0] || MA<Open[0], пойдет?

Да, в скобках номер свечи, для которой берётся зачение МА. Да, пойдёт и с ценой открытия.

CJIeCaPb:

Изменил способ получения профита в пунктах теперь: полученную разницу между текущей ценой и ценой открытия я стал делить на Point(строка 217 и 271). 

Сделал преобразования типов в строках: 218, 272, 369. Верно?

Для расчёта прибыли в пунктах вполне достаточно переменной Profit  (обьявить как целочисленный), остальные две - лишние:

 if(NormalizeDouble(Ask,Digits) <= NormalizeDouble(OrderOpenPrice(),Digits))
 {
  Profit = (int)((NormalizeDouble(OrderOpenPrice(),Digits)-NormalizeDouble(Ask,Digits))/Point);

  Profo = Profit/Point;
   Prof= (int)Profo;
 }
   
 if(OldProfit>Prof Profit )
  continue;
 else
  OldProfit=Prof Profit ; //ну и так далее, где профит считается

Ну и в кодобазе много тралов стоплосса есть, зачем лисапет изобретать, да ещё с прямоугольными колёсами???

 
evillive:

И когда, по-вашему, должен закрыться этот вот цикл

?

Исправил:

if(R==0)

{

 while(true)

 {

  Sleep(30000);

  Alert("Ошибка!");

  DeleteBuy=OrderDelete(OrderTicketBuy);

  DeleteSell=OrderDelete(OrderTicketSell);

  return(1);

 }

}

 

Расчет прибыли тоже.

 Вставил в цикл while (true) сообщение и обработку ошибок. Цикл работает,сообщение пишется, ошибок нет. Но  не  проходит по условию, данные будто не обновляются.

Файлы:
test3_7.mq4  16 kb
 
CJIeCaPb:

 Вставил в цикл while (true) сообщение и обработку ошибок. Цикл работает,сообщение пишется, ошибок нет. Но  не  проходит по условию, данные будто не обновляются.

Дам ещё подсказок.

Вот этот цикл рассматривает не все ордера, кроме того, если ордеров одного типа больше, чем один (например, выставлено три ордера байстоп), то что тогда будет?

for(i=1;i<=OrdersTotal();i++)
{
 Alert(i);
 if(OrderSelect(i-1,SELECT_BY_POS)==true)
 {
  if(OrderSymbol()!=Symb)continue;
  if(OrderType()==OP_BUYSTOP)
  {
   OrderTicketBuy=OrderTicket();
   Alert("Buy");
   }
   if(OrderType()==OP_SELLSTOP)
   {
   OrderTicketSell=OrderTicket();
   Alert("Sell");
   }
  }
}


Вот тут сначала рассматривается тип ордера, а уже потом этот ордер выбран, вобще-то должно быть наоборот, сначала выбрать ордер, а уже если ордер выбран - смотреть его тип и по-всякому над ним глумиться:

while(OrderType()==OP_BUY)//Buy
{
 RefreshRates();
 
 SelectBuy=OrderSelect(OrderTicketBuy,SELECT_BY_TICKET);
 ...
}
 
//--------------------------------------------------------------------------
//Sell
while(OrderType()==OP_SELL)
{
 RefreshRates();
  
 SelectSell=OrderSelect(OrderTicketSell,SELECT_BY_TICKET);
 ...
}
 


И в "свитче-который-типа-тралит-стоплосс", почему именно continue везде??? И когда будет исполнена вот эта строчка, в одном и во втором свитче?

    CloseBuy=OrderClose(OrderTicketBuy,Lote,Bid,1); continue;//119
-----
    CloseSell=OrderClose(OrderTicketSell,Lote,Ask,1); continue;//119