Уроки по программированию на языке MQL4 от eevviill

Юла

Гуру форума
Нет, не подходит, нужно закладывать формулы расчета в Excel , выводится только результат на график.
 

Ugar

Гуру форума
Нет, не подходит, нужно закладывать формулы расчета в Excel , выводится только результат на график.
В ячейках файла в таком случае находятся не результат, а формулы. При открытии файла будут извлечены именно они. Результат считает и отображает сам excel, в файле результатов нет.
Я посоветую эти формулы внести в код программы на mql, тогда excel вообще не нужен будет.
 

AlexeyVik

Программист mql4 mql5
Нет, не подходит, нужно закладывать формулы расчета в Excel , выводится только результат на график.
Ну тогда напиши программку на VB. Язык встроенный в Excel, достаточно богат для таких задач. Пусть он вычисляет и записывает данные в csv а оттуда возьмёт МТ своими средствами.
Ну или, я-бы попробовал такую связку:
В книге Excel все вычисления а в файле csv (он со значком Excel и по умолчанию в нём открывается) поставить ссылку на результат вычисления, =книга,страница,ячейка. Может прокатит...

ps: ну вот, Андрей развеял мои надежды. Да, этого я не учёл. Тогда остаётся писать на VB.
 
Последнее редактирование:

Ugar

Гуру форума
Ну тогда напиши программку на VB. Язык встроенный в Excel, достаточно богат для таких задач. Пусть он вычисляет и записывает данные в csv а оттуда возьмёт МТ своими средствами.
Ну или, я-бы попробовал такую связку:
В книге Excel все вычисления а в файле csv (он со значком Excel и по умолчанию в нём открывается) поставить ссылку на результат вычисления, =книга,страница,ячейка. Может прокатит...

ps: ну вот, Андрей развеял мои надежды. Да, этого я не учёл. Тогда остаётся писать на VB.
Практически всё что считается в excel, можно посчитать в mql.
Но если мы не ищем лёгких путей, то можно написать прогу на VB.
А ещё можно программно запустить и открыть файл в экселе, снять скриншот с экрана, из графического файла распознать текст, преобразовать в дробные значения... :laugh:
 

AlexeyVik

Программист mql4 mql5
Практически всё что считается в excel, можно посчитать в mql.
Но если мы не ищем лёгких путей, то можно написать прогу на VB.
А ещё можно программно запустить и открыть файл в экселе, снять скриншот с экрана, из графического файла распознать текст, преобразовать в дробные значения... :laugh:
Надеюсь это беззлобная подъё***
Не думаешь-же ты что реально так придёт кому-то в голову сделать...
В Excel есть волшебная клавиша F9 встаёшь на формулу нажимаешь на неё и вместо формулы результат вычисления. А программно перевести все результаты формул в числа совсем плёвое дело.
Ну не зря ведь человек хочет из Excel перетащить на график, значит есть тому причина. И нисколько этот вариант не сложней чем считать в MQL.
 

Ugar

Гуру форума
Надеюсь это беззлобная подъё***
Не думаешь-же ты что реально так придёт кому-то в голову сделать...
В Excel есть волшебная клавиша F9 встаёшь на формулу нажимаешь на неё и вместо формулы результат вычисления. А программно перевести все результаты формул в числа совсем плёвое дело.
Ну не зря ведь человек хочет из Excel перетащить на график, значит есть тому причина. И нисколько этот вариант не сложней чем считать в MQL.
Да, никакой злобы. Это конечно шутка. А если кроме шуток, то можно вообще не использовать промежуточный CSV файл. Можно используя VB и виндовые библиотеки, через оперативку транслировать прямо в программу на MQL.
Только всё это наверное не для уроков по MQL. Вернее к урокам по MQL придётся прибавить уроки по VB.
 

AlexeyVik

Программист mql4 mql5
Да, никакой злобы. Это конечно шутка. А если кроме шуток, то можно вообще не использовать промежуточный CSV файл. Можно используя VB и виндовые библиотеки, через оперативку транслировать прямо в программу на MQL.
Только всё это наверное не для уроков по MQL. Вернее к урокам по MQL придётся прибавить уроки по VB.
Ага... А потом С++, делфи, фортран... Ну и ещё чего нибудь.:D
А в моих словах главное было что подъё***, а что она беззлобная я и так понимал.
 

AlexeyVik

Программист mql4 mql5
А у меня и без вас все получилось, сделала скрипт. В помощи не нуждаюсь.
Молодца.
rose.gif
 

Milord

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

Dom

Гуру форума
Здравствуйте!Уважаемые программисты!Помогите пожалуйста!Я часто использую пользовательские функции Кирилла.У меня выставлено два противоположных ордера,один из них закрылся по TakeProfit,мне надо удалить второй.Я делаю так:
Код:
 if(isCloseLastPosByTake(NULL,-1,Magic)==true){
               if(ExistPositions(NULL,-1,Magic)==false){                                                         
       if(NumberOfOrders(NULL,-1,Magic)==1){
           DeleteOrders(NULL,-1,Magic);
           return(0);
      }}}
он не удаляется.Первая функция это:"Возвращает флаг закрытия последней позиции по тейку."Что я не так делаю?
И второй вопрос.Советник работает нормально,неделю,две,затем бах на спокойном рынке открывает позицию,противоположную той,которая запрограммирована.Я не знаю,как с этим бороться.
 

eevviill

Заблокирован
Здравствуйте!Уважаемые программисты!Помогите пожалуйста!Я часто использую пользовательские функции Кирилла.У меня выставлено два противоположных ордера,один из них закрылся по TakeProfit,мне надо удалить второй.Я делаю так:
Код:
 if(isCloseLastPosByTake(NULL,-1,Magic)==true){
               if(ExistPositions(NULL,-1,Magic)==false){                                                         
       if(NumberOfOrders(NULL,-1,Magic)==1){
           DeleteOrders(NULL,-1,Magic);
           return(0);
      }}}
он не удаляется.Первая функция это:"Возвращает флаг закрытия последней позиции по тейку."Что я не так делаю?
И второй вопрос.Советник работает нормально,неделю,две,затем бах на спокойном рынке открывает позицию,противоположную той,которая запрограммирована.Я не знаю,как с этим бороться.
Дом если бы это был не ты, то я бы почти нагрубил бы. Потому что есть соответсвующая ветка.
Противоположные это 2 отложки?
Рыночные?
Я бы решал это так.
Искал бы последний закрытый ордер. И если он закрытый по ТП, то
брал с него данные(бай или сел, если надо то лоты).
И потом бы сравнивал с последним открытым ордером.
Твоя проблема навреное в том. Глянь где есть
PHP:
OrderClosePrice()==OrderTakeProfit()
нормализируй их
PHP:
NormalizeDouble(OrderClosePrice(),Digits)==NormalizeDouble(OrderTakeProfit(),Digits)

Ах да. Я кажется понял. Если ты на ЕСН это делаешь, то там редко когда цена закрытия равна ТП или СЛ. Так что последний закрытый ордер прийдётся искать по коментарию к ордеру. Иксать буквы tp
Короче покажи функцию isCloseLastPosByTake
 
Последнее редактирование:
  • Like
Реакции: Dom

_SERG_

Активный участник
Здравствуйте!Уважаемые программисты!Помогите пожалуйста!Я часто использую пользовательские функции Кирилла.У меня выставлено два противоположных ордера,один из них закрылся по TakeProfit,мне надо удалить второй.Я делаю так:
Код:
 if(isCloseLastPosByTake(NULL,-1,Magic)==true){
               if(ExistPositions(NULL,-1,Magic)==false){                                                         
       if(NumberOfOrders(NULL,-1,Magic)==1){
           DeleteOrders(NULL,-1,Magic);
           return(0);
      }}}
он не удаляется.Первая функция это:"Возвращает флаг закрытия последней позиции по тейку."Что я не так делаю?
И второй вопрос.Советник работает нормально,неделю,две,затем бах на спокойном рынке открывает позицию,противоположную той,которая запрограммирована.Я не знаю,как с этим бороться.

Про второй вопрос.

У меня такая ситуация встречалась, когда якобы случайно открывался ордер.
Пришлось проверять все переменные отвечающие за открытие позиций, и как они обновляются в советнике.
 

Dom

Гуру форума
Дом если бы это был не ты, то я бы почти нагрубил бы. Потому что есть соответсвующая ветка.
Противоположные это 2 отложки?
Рыночные?
Я бы решал это так.
Искал бы последний закрытый ордер. И если он закрытый по ТП, то
брал с него данные(бай или сел, если надо то лоты).
И потом бы сравнивал с последним открытым ордером.
Твоя проблема навреное в том. Глянь где есть
PHP:
OrderClosePrice()==OrderTakeProfit()
нормализируй их
PHP:
NormalizeDouble(OrderClosePrice(),Digits)==NormalizeDouble(OrderTakeProfit(),Digits)

Ах да. Я кажется понял. Если ты на ЕСН это делаешь, то там редко когда цена закрытия равна ТП или СЛ. Так что последний закрытый ордер прийдётся искать по коментарию к ордеру. Иксать буквы tp
Короче покажи функцию isCloseLastPosByTake
Извините,что не в этой ветке,голова уже не соображает.Спасибо,что ответили,буду разбираться.Функция:
Код:
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по тейку.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if (ocp==otp) return(True);
  }
  return(False);
}
 

eevviill

Заблокирован
Ну значит так как я говорил. Потом сделаю проверку по коментарию.
PHP:
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) 
{
int time_close;
int latest_closed_order;
for(int h=OrdersHistoryTotal()-1;h>=0;h--)
{
if(OrderSelect(h,SELECT_BY_POS,MODE_HISTORY))
{
if((OrderSymbol()==sy || sy=="") && (OrderType()==op || op==-1) && (OrderMagicNumber()==mn || mn==-1))
 {
if(OrderCloseTime()>time_close)
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
time_close=OrderCloseTime();
latest_closed_order=h;
}
}
}
} 
}
 
 
 if(OrderSelect(latest_closed_order,SELECT_BY_POS,MODE_HISTORY))
 {
 if(StringFind(OrderComment(),"[tp]",0)!=-1)
 return(true);
 }

  
  return(False);
}
 
Последнее редактирование:
  • Like
Реакции: Dom

Dom

Гуру форума
PHP:
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) 
{
int time_close;
int latest_closed_order;
for(int h=OrdersHistoryTotal()-1;h>=0;h--)
{
if(OrderSelect(h,SELECT_BY_POS,MODE_HISTORY))
{
if((OrderSymbol()==sy || sy=="") && (OrderType()==op || op==-1) && (OrderMagicNumber()==mn || mn==-1))
 {
if(OrderCloseTime()>time_close)
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
time_close=OrderCloseTime();
latest_closed_order=h;
}
}
}
} 
}
 
 
 if(OrderSelect(latest_closed_order,SELECT_BY_POS,MODE_HISTORY))
 {
 if(StringFind(OrderComment(),"[tp]",0)!=-1)
 return(true);
 }
 
 
  return(False);
}
eevviill!Нет слов.Огромное спасибо!Мне бы долго пришлось с этим разбираться.Премного благодарен!!!
 

eevviill

Заблокирован
eevviill!Нет слов.Огромное спасибо!Мне бы долго пришлось с этим разбираться.Премного благодарен!!!
Пожалуйста. Но мне Гамбер(надеюсь правильно на руский транслировал) замечание сделал как лучше. Не порядковый номер записывать, а тикет.
PHP:
latest_closed_order=OrderTicket();
}
}
}
} 
}
 
 
 if(OrderSelect(latest_closed_order,SELECT_BY_TICKET,MODE_HISTORY))
 
  • Like
Реакции: Dom

Milord

Местный знаток
1.3) {} (квадратные скобки) - применяются для начала фунции и конца.
1.4) () (скобки) - в них(не всегда) записываются свойства операции.
не вытерпел, извините, при всем уважении есть одна неточность, думаю для тех кто начинает изучать язык нельзя запоминать неверные значения...незнаю ваши слова или цитата от куда то, в любом случае это неверно, потому что еще из математики известно:
скобки [ ] называются квадратными, ибо они и похожи на квадрат,
скобки { } называются фигурными, потому что они реально фигурные, а не квадратные....надеюсь без обид, просто переживаю за тех кто запоминает неверные понятия...
а вот скобки ( ) - обычные скобки!
 
Последнее редактирование:

Dom

Гуру форума
Пожалуйста. Но мне Гамбер(надеюсь правильно на руский транслировал) замечание сделал как лучше. Не порядковый номер записывать, а тикет.
PHP:
latest_closed_order=OrderTicket();
}
}
}
} 
}
 
 
 if(OrderSelect(latest_closed_order,SELECT_BY_TICKET,MODE_HISTORY))
Понял!Спасибо!
 
Верх