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

maximuson

Новичок форума
Помогите чайнику. Тема может быть заежжена. Но все же. Есть код проверки открытых ордеров. т.е. понятно нет открытых значит ++. Как дописать условие "если СЕГОДНЯ нет открытых ордеров"? потому что есть открытые вчера, неделю, месяц.....

int OB,OS;

for ( int i=0; i<OrdersTotal(); i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (OrderSymbol()==Symbol() && OrderType()==0)
{
OB++;
}
if (OrderSymbol()==Symbol() && OrderType()==1)
{
OS++;
}
}
 
Последнее редактирование:

Абдулхаким

Почетный гражданин
Из-за чего может быть ошибка?

Здравствуйте.
Подскажите пожалуйста из-за чего бывает ошибка " 2017.02.10 17:22:08.078 Access violation read to 0x06299F44 in 'C:\Program Files\MT 4 Конкурс\MQL4\indicators\Тик.ex4' ".
После нанесения на график нормально работает неопределенное время (от нескольких минут до нескольких суток). После ошибки остается висеть на графике, но "без признаков жизни".
Ошибка во вкладке "Эксперты".
 

_SERG_

Активный участник
Здравствуйте.
Подскажите пожалуйста из-за чего бывает ошибка " 2017.02.10 17:22:08.078 Access violation read to 0x06299F44 in 'C:\Program Files\MT 4 Конкурс\MQL4\indicators\Тик.ex4' ".
После нанесения на график нормально работает неопределенное время (от нескольких минут до нескольких суток). После ошибки остается висеть на графике, но "без признаков жизни".
Ошибка во вкладке "Эксперты".

Код советника или эксперта не аккуратненько работает с памятью операционки.
Если с точки зрения хакера, то где-то переполняется какой-то из буферов.
Написал разработчикам, отослал свой код, через пару недель вышло обновление терминала. Сейчас код работает устойчиво, а раньше как у тебя было.
Что они сделали, не отчитались, наслаждаюсь чем есть.:laugh:
 

Rennela

Новичок форума
Помогите чайнику. Тема может быть заежжена. Но все же. Есть код проверки открытых ордеров. т.е. понятно нет открытых значит ++. Как дописать условие "если СЕГОДНЯ нет открытых ордеров"? потому что есть открытые вчера, неделю, месяц.....
Наверно,++ это если есть открытые ордера. Если нужно узнать какие открыты сегодня, то я бы написал приблизительно так:
PHP:
datetime T;
int OB,OS;
void OnStart()
  {
  T=iTime(Symbol(),PERIOD_D1,0);
  for(int i=0;i<=OrdersTotal();i++)
    {
    if(OrderSelect(i-1,SELECT_BY_POS,MODE_TRADES)==true)
      {
      if(OrderOpenTime()<T)continue;
      if(OrderSymbol()==Symbol()&&OrderType()==OP_BUY){OB++;}
      if(OrderSymbol()==Symbol()&&OrderType()==OP_SELL){OS++;} 
      }
    }
  Alert("T=",TimeToString(T)," OB=",OB," OS=",OS);  
  }
 

AlexeyVik

Программист mql4 mql5
Наверно,++ это если есть открытые ордера. Если нужно узнать какие открыты сегодня, то я бы написал приблизительно так:
PHP:
datetime T;int OB,OS;void OnStart()  {  T=iTime(Symbol(),PERIOD_D1,0);  for(int i=0;i<=OrdersTotal();i++)    {    if(OrderSelect(i-1,SELECT_BY_POS,MODE_TRADES)==true)      {      if(OrderOpenTime()<T)continue;      if(OrderSymbol()==Symbol()&&OrderType()==OP_BUY){OB++;}      if(OrderSymbol()==Symbol()&&OrderType()==OP_SELL){OS++;}       }    }  Alert("T=",TimeToString(T)," OB=",OB," OS=",OS);    }
А вот эта строка
if(OrderSelect(i-1,SELECT_BY_POS,MODE_TRADES)==true)
не смущает? Разве индикация начинается с -1 (минус 1)?
И зачем две одинаковые проверки символа?
 

Абдулхаким

Почетный гражданин
Код советника или эксперта не аккуратненько работает с памятью операционки.
Если с точки зрения хакера, то где-то переполняется какой-то из буферов.
Спасибо.
а раньше как у тебя было
раньше сбоев не замечал, после какого-то обновления началось :)
 

Rennela

Новичок форума
А вот эта строка
if(OrderSelect(i-1,SELECT_BY_POS,MODE_TRADES)==true)
не смущает? Разве индикация начинается с -1 (минус 1)?
И зачем две одинаковые проверки символа?

Может быть -1 и не нужно. Пишу как по учебнику :)(там вроде упоминалось,что если во время итераций цикла рыночный закроется,чтобы не пропустить-я так понял). Проверку символа можно в разных вариантах написать,код не большой,лишняя строка не помешает, maximuson, понятней будет-его код.А как бы вы написали?
 

maximuson

Новичок форума
Может быть -1 и не нужно. Пишу как по учебнику :)(там вроде упоминалось,что если во время итераций цикла рыночный закроется,чтобы не пропустить-я так понял). Проверку символа можно в разных вариантах написать,код не большой,лишняя строка не помешает, maximuson, понятней будет-его код.А как бы вы написали?

Господа программисты. Общий смысл этого кода: начало торговой сессии, идёт проверка открытых ордеров + мой сигнал, если нет открытых (OB ==0) то окрываем. Т.к. торговля долгосрочная и ордера ещё не закрыты. В следующую сессию (начало следующего дня) ОВ==0 сегодня. То снова открываем.
 

AlexeyVik

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

Код:
[COLOR=#000000][COLOR=#007700]
[/COLOR][/COLOR][COLOR=#000000][COLOR=#0000BB][COLOR=#000000][COLOR=#0000BB]datetime T[/COLOR][COLOR=#007700];
[/COLOR][/COLOR]int OB[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB]OS[/COLOR][COLOR=#007700]; 
[/COLOR][COLOR=#0000BB]void OnStart[/COLOR][COLOR=#007700]() 
  {[/COLOR][COLOR=#007700] 
  [/COLOR][/COLOR][COLOR=#000000][COLOR=#007700][COLOR=#000000][COLOR=#0000BB]T[/COLOR][COLOR=#007700]=[/COLOR][COLOR=#0000BB]iTime[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]Symbol[/COLOR][COLOR=#007700](),[/COLOR][COLOR=#0000BB]PERIOD_D1[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700]);[/COLOR][/COLOR]  
  for([/COLOR][COLOR=#0000BB]int i[/COLOR][COLOR=#007700]=[/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700];[/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700]<[/COLOR][COLOR=#0000BB]OrdersTotal[/COLOR][COLOR=#007700]();[/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700]++) 
    { 
    if([/COLOR][COLOR=#0000BB]OrderSelect[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB]SELECT_BY_POS[/COLOR][COLOR=#007700]) && [/COLOR][/COLOR][COLOR=#000000][COLOR=#007700][COLOR=#000000][COLOR=#0000BB]OrderSymbol[/COLOR][COLOR=#007700]()==[/COLOR][COLOR=#0000BB]Symbol[/COLOR][COLOR=#007700]()[/COLOR][/COLOR][/COLOR][COLOR=#007700] && [/COLOR][/COLOR][COLOR=#000000][COLOR=#007700][COLOR=#000000][COLOR=#0000BB]OrderOpenTime[/COLOR][COLOR=#007700]()>[/COLOR][/COLOR][COLOR=#000000][COLOR=#007700][COLOR=#000000][COLOR=#0000BB]=T[/COLOR][/COLOR][/COLOR][/COLOR]) 
      { [/COLOR][/COLOR][COLOR=#000000][COLOR=#007700]
      if([/COLOR][COLOR=#0000BB]OrderType[/COLOR][COLOR=#007700]()==[/COLOR][COLOR=#0000BB]OP_BUY[/COLOR][COLOR=#007700]) [/COLOR][COLOR=#0000BB]OB[/COLOR][COLOR=#007700]++;
      if([/COLOR][COLOR=#0000BB]OrderType[/COLOR][COLOR=#007700]()==[/COLOR][COLOR=#0000BB]OP_SELL[/COLOR][COLOR=#007700]) [/COLOR][COLOR=#0000BB]OS[/COLOR][COLOR=#007700]++;
      } 
    } 
  [/COLOR][COLOR=#0000BB]Alert[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"T="[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB]TimeToString[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]T[/COLOR][COLOR=#007700]),[/COLOR][COLOR=#DD0000]" OB="[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB]OB[/COLOR][COLOR=#007700],[/COLOR][COLOR=#DD0000]" OS="[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB]OS[/COLOR][COLOR=#007700]);   
  }  [/COLOR][/COLOR]
 

maximuson

Новичок форума
Спасибо AlexeyVik и Rennela все получилось!! как надо!!

И еще одна просьба. Блок кода поиска САМОГО убыточного ордера.
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Спасибо AlexeyVik и Rennela все получилось!! как надо!!

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

maximuson

Новичок форума
Писать полный код даже не проси. Я могу только подсказывать, делать кубики лего не моя профессия. Извиняй за прямоту.
спаибо за ответ.

double MaxOrderBuy,MinOrderSell;
double OOP,Profit,ProfitPlus,LossBuy,LossSell;
int TicketB,TicketS,tip;
for (int u=0; u<OrdersTotal(); u++)
{
if (OrderSelect(u,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && magic==OrderMagicNumber())
{
tip = OrderType();
OOP = NormalizeDouble(OrderOpenPrice(),Digits);
Profit=OrderProfit()+OrderCommission()+OrderSwap();
if (Profit>0) ProfitPlus+=Profit;
if (tip==OP_BUY)
{
if (MaxOrderBuy < OOP || MaxOrderBuy==0) {MaxOrderBuy = OOP; TicketB=OrderTicket(); LossBuy=Profit;}
}
if (tip==OP_SELL)
{
if (MinOrderSell > OOP || MinOrderSell==0) {MinOrderSell = OOP; TicketS=OrderTicket(); LossSell=Profit;}
}
}
}
}

TicketB и TicketS и есть самые убыточные..
 

AlexeyVik

Программист mql4 mql5
спаибо за ответ.



TicketB и TicketS и есть самые убыточные..
Нормально. Только несколько незначительных замечаний. И-то чтобы придраться. :D

OrderSelect(u,SELECT_BY_POS,MODE_TRADES)
MODE_TRADES идёт по умолчанию, я это никогда не пишу.
Сейчас проверка условий прерывается при первом-же не выполненном условии. Поэтому ничего не мешает объединить выбор ордера с отбором по символу и магику в одно условие
if(OrderSelect(u,SELECT_BY_POS && OrderSymbol()==Symbol() && magic==OrderMagicNumber())
Если нужен убыточный ордер из Buy отдельно от ордеров Sell то конечно почти правильно. Только ищешь не убыток, а цену открытия. А если ордера будут с разными лотами? Поэтому лучше сверять
Profit=OrderProfit()+OrderCommission()+OrderSwap();
и соответственно если Profit очередного ордера будет меньше раньше записанного в переменные, то переменные переписываем.
И тут-же полученное значение Profit можно и приплюсовать для определения общего профита по всем ордерам.
 

mattew

Интересующийся
Подскажите, пожалуйста, почему у меня возникает такой казус. Для вывода значений из буферов индикаторов я использую Comment. Но в одном случае выводится все нормально, а в другом, аналогичном, выводятся нули. Данные о буферах беру прямо из исходника.
 

gince

Местный знаток
Помогите знатоки.

Есть панель для быстрого перехода по валютным парам. Торгую ручками и на ручками рисую прямоугольники на всех парах. При переключений приходиться их стирать, так как на другой паре надо рисовать другие . Это очень не удобно. Хотел как то это дело зашить в коде.

Надо при возрате на пару, на которой уже были нарисованы прямоугольники их вернуть. Для щтого дела надо их запомнить для каждой ваьютной пары отдельно.
С одной пары я сделал так
PHP:
 string name;
      int syRest_index=0;

      for(i=0;i<ObjectsTotal();i++)
        {
         name=ObjectName(i);
         if(ObjectType(name)==OBJ_RECTANGLE)
           {
            Print("OBJ_RECTANGLE Name","  ",name);

            double y1_=ObjectGetDouble(ChartID(),name,OBJPROP_PRICE,0);        Print("Value 1","  ",DoubleToString(y1_,_Digits));
            double y2_=ObjectGetDouble(ChartID(),name,OBJPROP_PRICE,1);        Print("Value 2","  ",y2_);

            datetime x1_=ObjectGetInteger(0,"Rectangle 7404",OBJPROP_TIME,0);       //gerai    Print("Value","  ",x1_);
            datetime x2_=ObjectGetInteger(0,"Rectangle 7404",OBJPROP_TIME,1);     //gerai    Print("Value","  ",x2_);

            syRest_index++;    Print("Value  syRest_index","  ",syRest_index);
           }
        }
Тут в цикле проходим все прямоугольники и узнаем название, координаты (цены, время) и и количество на данном графике.

Дальше наверное надо работать с глобальными переменными. Но не могу придумать филтрацию глобальных переменных, чтоб знать , какие кординаты пренадлежат какой валютной паре.
 

Ugar

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

gh68

Активный участник
Подскажите пжлста, что значит nmc в названии индикатора? Спасибо.
Например nrp - NonRePaint. А nmc не знаю.
 
Последнее редактирование:

Ugar

Гуру форума
Подскажите пжлста, что значит nmc в названии индикатора? Спасибо.
Например nrp - NonRePaint. А nmc не знаю.
Название пользовательского индикатора полностью зависит от фантазии программиста, или того кто его заказывал программисту, или того кто его переименовал.
По этому лучше спрашивать у автора, что там за аббревиатуры.
 

_SERG_

Активный участник
Помогите знатоки.

Есть панель для быстрого перехода по валютным парам. Торгую ручками и на ручками рисую прямоугольники на всех парах. При переключений приходиться их стирать, так как на другой паре надо рисовать другие . Это очень не удобно. Хотел как то это дело зашить в коде.

Надо при возрате на пару, на которой уже были нарисованы прямоугольники их вернуть. Для щтого дела надо их запомнить для каждой ваьютной пары отдельно.
С одной пары я сделал так
PHP:
 string name;
      int syRest_index=0;

      for(i=0;i<ObjectsTotal();i++)
        {
         name=ObjectName(i);
         if(ObjectType(name)==OBJ_RECTANGLE)
           {
            Print("OBJ_RECTANGLE Name","  ",name);

            double y1_=ObjectGetDouble(ChartID(),name,OBJPROP_PRICE,0);        Print("Value 1","  ",DoubleToString(y1_,_Digits));
            double y2_=ObjectGetDouble(ChartID(),name,OBJPROP_PRICE,1);        Print("Value 2","  ",y2_);

            datetime x1_=ObjectGetInteger(0,"Rectangle 7404",OBJPROP_TIME,0);       //gerai    Print("Value","  ",x1_);
            datetime x2_=ObjectGetInteger(0,"Rectangle 7404",OBJPROP_TIME,1);     //gerai    Print("Value","  ",x2_);

            syRest_index++;    Print("Value  syRest_index","  ",syRest_index);
           }
        }
Тут в цикле проходим все прямоугольники и узнаем название, координаты (цены, время) и и количество на данном графике.

Дальше наверное надо работать с глобальными переменными. Но не могу придумать филтрацию глобальных переменных, чтоб знать , какие кординаты пренадлежат какой валютной паре.

OBJ_RECTANGLE - Мысль правильная, ток через уциндаз, и поэтому надо что-то, где-то искать и ошибаться, найти и не сдаваться. :laugh::laugh::laugh:

"панель для быстрого перехода... " Эт, которая "Окна", называется? (Alt+W?)
Мож просто писнуть индикатор, а в параметрах у индикатора, "N" строчек, по количеству прямоугольников, которые хотелось бы нарисовать, а в каждом строчке данные для прямоугольника(цена/время-цена/время, цвет), ну и весь этот кипиш, когда напишешь индикатор, на графики.
Вводи параметры, и пусть себе рисует и перерисовывает.
 

gince

Местный знаток
OBJ_RECTANGLE - Мысль правильная, ток через уциндаз, и поэтому надо что-то, где-то искать и ошибаться, найти и не сдаваться. :laugh::laugh::laugh:

"панель для быстрого перехода... " Эт, которая "Окна", называется? (Alt+W?)
Мож просто писнуть индикатор, а в параметрах у индикатора, "N" строчек, по количеству прямоугольников, которые хотелось бы нарисовать, а в каждом строчке данные для прямоугольника(цена/время-цена/время, цвет), ну и весь этот кипиш, когда напишешь индикатор, на графики.
Вводи параметры, и пусть себе рисует и перерисовывает.
Спосибо за ваши мысли, ноя сделаю так как задумал и еще раз спасибо ugar .
 
Верх