Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 85

 
deathmond1990:
Здравсвтвуйте. Вопрос такой: можно ли загнать значения тиков (соответствующие цены) за определенный торговый период (т.е за одну свечу) в одномерный массив? Причем сделать это так, что бы массив формировался на протяжении формирования свечи. Реально ли это в MQL4? Буду благодарен за ответ.


Реально. Динамический массив и в путь.

//-----------------------+
int k=0;       //на глобальном уровне
double тики[];
//----------------
void OnTick()
  {
   ArrayResize(тики,k+1);
   тики[k]=Bid;
   k++;
  }
//+------------------------
 
Alekseu Fedotov:


Реально. Динамический массив и в путь.

Огромное спасибо =)
 
Приветствую господа! Не хочу что бы это приняли за флуд, но мне без этой функции ни как не обойтись. Ну так что ребят кто нибудь сможет помочь мне с функцией которая перебирает все ордера и удаляет одновременно два ордера, один с самым маленьким лотом и отрицательным профитом из существующих на графике, а второй с самым большим лотом и положительным профитом так же из существующих. 
 
Arseniy Barudkin:
Приветствую господа! Не хочу что бы это приняли за флуд, но мне без этой функции ни как не обойтись. Ну так что ребят кто нибудь сможет помочь мне с функцией которая перебирает все ордера и удаляет одновременно два ордера, один с самым маленьким лотом и отрицательным профитом из существующих на графике, а второй с самым большим лотом и положительным профитом так же из существующих. 

Попробуй поиском     OrderCloseBy
 

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

Вопрос касается переменных объявленных в начале кода вот так:

#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double  VAR1 = 1;

double VAR2[1000];

Нужно не потерять значения VAR1 и VAR2 (массив наполняется данными в процессе работы советника). Пока из идей только запись в файл (global.txt) на каждом тике, а при запуске терминала чтение из этого файла (global.txt) и воссоздание переменных, а далее опять запись на каждом тике. Какие есть еще варианты?

 
smart_man:

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

Вопрос касается переменных объявленных вот так:

extern double  VAR1 = 1;

double VAR2[1000];

Нужно не потерять значения VAR1 и VAR2 (массив наполняется данными в процессе работы советника). Пока из идей только запись в файл (global.txt) на каждом тике, а при запуске терминала чтение из этого файла (global.txt) и воссоздание переменных, а далее опять запись на каждом тике. Какие есть еще варианты?

Вариант

Глобальные переменные клиентского терминала

//--------

Не путать с переменными объявленными на глобальном уровне

 
fxtz:

Вопрос В метатрейдере 4 можно ли написать программу, чтобы открыть от 2 до 250 позиций по моему выбору с заданным стоплоссом и заданным профитом в один клик? Чтоб не открывать вручную по одной


Вы нашли ДЦ, где можно открывать столь много ордеров на одном инструменте? Обычно 100 ордеров - ограничение на все инструменты...

И, да, открыть получалось 100.

 
Alekseu Fedotov:

Попробуй поиском     OrderCloseBy

Спасибо! Но мне как то надо тикеты этих ордеров выбрать из как минимум 3 ордеров, чаще их бывет больше от 5 до 10 ордеров, неужели мне надо вычислять и сравнивать лоты и профиты этих ордеров по отдельности?!

 
Arseniy Barudkin:  надо тикеты ордеров выбрать, неужели надо вычислять и сравнивать лоты и профиты этих ордеров по отдельности?!

Ситуация намного хуже, чем Вы представляете. В каждый момент доступен лишь один ордер, выбранный функцией OrderSelect(). И когда выбран самый первый ордер, то с чем его сравнивать? Умельцы правда делают что-то примерно вот так

double МинПрофит=1000000, МаксПрофит=-1000000;
int МаксТикет=0, МинТикет=0;
for(int Номер=OrdersTotal-1; Номер>=0; Номер--)
{
   if(!OrderSelect(Номер,SELECT_BY_POS)) continue;
   if(OrderProfit()>МаксПрофит)
   {
      МаксТикет=OrderTicket();
      МаксПрофит=OrderProfit();
   }
   else if(OrderProfit()<МинПрофит)
   {
      МинТикет=OrderTicket();
      МинПрофит=OrderProfit();
   }
 }
Потом посмотреть на значение найденных тикетов - вдруг они нулевые!!!
 
STARIJ:

Ситуация намного хуже, чем Вы представляете. В каждый момент доступен лишь один ордер, выбранный функцией OrderSelect(). И когда выбран самый первый ордер, то с чем его сравнивать? Умельцы правда делают что-то примерно вот так

Потом посмотреть на значение найденных тикетов - вдруг они нулевые!!!

Спасибо за помощь! Пока оставил вот так, сейчас решил немного изменить условия при которых функция вызывается. А вообще вы мне очень помогли))
void MarginDefuse(double lot1=0,double lot2=0)
{
 int ticket1=0,ticket2=0,type=-1;
 double profit1=0,profit2=0;
 bool res1=false,res2=false;
 // Выделение
 for(int i=0; i<OrdersTotal(); i++)
 {
  if(!OrderSelect(i,SELECT_BY_POS)) continue; // Что-то помешало - идем к следующему
  if(OrderSymbol() != Symbol()) continue;          // Чужой график
  if(OrderType()<2 && OrderMagicNumber() == Magic)
  {
   if(OrderLots()>=lot1 && OrderProfit()<0)
   {
    ticket1=OrderTicket();
    lot1=OrderLots();
    type=OrderType();
    profit1=OrderProfit();
   }
  }
 }
 for(int i=OrdersTotal()-1; i>=0; i--)
 {
  if(!OrderSelect(i,SELECT_BY_POS)) continue; // Что-то помешало - идем к следующему
  if(OrderSymbol() != Symbol()) continue;          // Чужой график
  if(OrderType() != type && OrderType()<2 && OrderMagicNumber() == Magic)
  {
   if(OrderLots() >= lot2/Multipler && OrderProfit()>0 && OrderLots()>lot1)
   {
    ticket2 = OrderTicket();
    lot2 = OrderLots();
    profit2=OrderProfit();
   }
  }
 }
 if((profit1+profit2)>0 && lot1<lot2)
 {
  while (!RefreshRates());
  if(ticket1)
  {
   if(OrderSelect(ticket1,SELECT_BY_TICKET))
   res1=OrderCloseX(ticket1,lot1);
  }
  if(ticket2)
  {
   if(OrderSelect(ticket2,SELECT_BY_TICKET))
   res2=OrderCloseX(ticket2,lot2);
  }
  if(res1 && res2)
   DeletePos();
 }
}