Vim в качестве ide для mql - страница 6

 
Vladimir Simakov :

Привет, зеленый, не видел тебя целую вечность))) Где твой кортеж?))) 

Все хорошо. Все на месте.

 
Dmitry Fedoseev:

Все хорошо. Все на месте.

Уч ты. Я даже про существование такого языка до сего момента не знал. Век живи - век учись!
 

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

Для тех, кто не в теме: я писал на скучном Английском, а вот Дмитрий реально поразил, ответил на чистейшем Телугу, я о таком даже не подозревал. Но, к сожалению, пробегал модератор)))

Шутка.

 
Vladimir Simakov:

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

Для тех, кто не в теме: я писал на скучном Английском, а вот Дмитрий реально поразил, ответил на чистейшем Телугу, я о таком даже не подозревал. Но, к сожалению, пробегал модератор)))

Шутка.

Нужно выписать медаль как минимум. Наверное ждёт пока вызовут в кабинет и при всех вручат грамоту!


 
Vitaly Muzichenko:

Так а ничего нового и быть не может, всё по кругу: "Открыл -> Протралил -> Закрыл"

Когда-то давно работал на монолите на стройке, точно также всё как было несколько лет назад: "Собрали опалубку -> Повязали арматуру -> Залили бетоном -> Разобрали опалубку" и так по кругу, потому что другого не дано :)

Ну почему же:

cPos=new CRealPosition(cParam);

вот так активируется позиция,

//----------------------------------------------------
void CTradePos::RealControl(uint &mCount,double &mProfit){
   if (cPos.Control(mProfit)){
      if (!cFlag.Check(TRADE_POS_FLAG_ACTIVE)&&cPos.IsActivate()){
         if (!cParam.isExtraLimit) ++mCount;
         cFlag+=TRADE_POS_FLAG_ACTIVE_ON;}}
   else{
      if (!cParam.isExtraLimit&&cFlag.Check(TRADE_POS_FLAG_ACTIVE)) --mCount;
      cFlag+=TRADE_POS_FLAG_STOP_TRADE;
      if (cPos.IsTPClosed()) cFlag+=TRADE_POS_FLAG_STOP_TP;
      DELETE(cPos);}}

а вот так она сопровождается. Причем это mql5, на mql4 идентичный код был бы. CRealPosition это:

#include <MyMQLLib\Objects\Trade\CPosition.mqh>
#include "CTPTral.mqh"

class CRealPosition:public CPosition
  {
   CTPTral*          cTPTral;
   double            cControlSL;
public:
                     CRealPosition(SOrderParam &mParam);
                    ~CRealPosition() {DEL(cTPTral);}
   bool              Control(double &mProfit);
   bool              CheckChangeSL();
   void              SetNewStops(double mSL,double mTP);
   void              TPTralSet(double mStep,double mPrice,double mTPDelta);
   int               GetSLPoint()   {return !_sl?0:int(MathRound(MathAbs((_price-_sl)/_point)));}
  };

...

void CRealPosition::CRealPosition(SOrderParam &mParam):
   CPosition(_Symbol,
             mParam.type,
             mParam.volume,
             mParam.price,
             mParam.sl,
             mParam.tp,
             0,0,0,
             mParam.comment),
   cTPTral(NULL)
   {cControlSL=cOrderSL;}
//---------------------------------------------------------------------------------------------------------
bool CRealPosition::Control(double &mProfit){
   ulong res=CPosition::Control();
   if (!(res&TRADE_FINISH)) mProfit+=GetTotalProfit();
   if (IsOpen()){
      if (cTPTral!=NULL){
         double price=TradePrice(_symbol,-_direct),
                tp=cTPTral.GetTP(price,GetTP(),_price);
         if (tp!=_tp) NewTP(tp,price);}}
   return !(res&TRADE_FINISH);}

А вот CPosition уже и является частью библиотеки, которая сопровождает торговую операцию (неважно mql4 или mql5, правда неттинг еще не до конца реализован) от инициации и до закрытия.

И да, еще момент, перебор всех позиций, которые находятся в сетке, а это сеточник, причем с разветвленной логикой, выполняется так:

#define _FIRST (mIsRevers?cTrade.End():cTrade.Begine())
#define _DELETE (mIsRevers?cTrade.Delete():cTrade.DeleteRevers())
#define _NEXT (mIsRevers?cTrade.Prev():cTrade.Next())
uint CGrid::Control(bool mIsRevers){
   double newSL=0.0;
   double trendProfit=0.0,
          oppositeProfit=0.0;
   CheckVirtualSL();
   for (CTrade* it=_FIRST;it!=NULL;){
      if (gFlag.Check(G_FLAG_CLOSE_ALL)) it=it.Close()?_DELETE:_NEXT;
      else{
         bool res=it.Control(cOpenControlCount,trendProfit,oppositeProfit);
         if (it.IsNewOppositeActivate()) ChangePrevOppositeSL(it);
         if (mIsRevers){
            if (!(cFlag&GRID_FLAG_TRAL_START)&&res) StartTral(it);
            if (it.CheckChangeTrendSL()) newSL=it.GetTrendSL();
            else if (newSL!=0.0) it.SetTrendSL(newSL);}
         else{
            if (it.IsStart()) CheckPrevTrades(it);
            if (it.IsNewTrendActivate()){
               ChangePrevTP(it);
               if (cTrade.IsLast()) 
                  cFlag|=GRID_FLAG_LAST_OPEN;}
            if (eIsXProfit&&!(cFlag&GRID_FLAG_X_START)&&res&&it.IsTrendActivate()) CheckXTrade(it);}
         it=res?_NEXT:_DELETE;}}
   if (eIsOppositOrder&&oppositeProfit>trendProfit&&oppositeProfit+trendProfit>=eVirtualTP) gFlag+=G_FLAG_CLOSE_ALL;
   if (!(cFlag&GRID_FLAG_X_START)      &&
       !(gFlag&G_FLAG_CLOSE_ALL)       &&
       bool(cFlag&GRID_FLAG_LAST_OPEN) &&
       eIsXProfit)                     StartXGrid();
   if (cXTrade!=NULL&&!cXTrade.Control()) DELETE(cXTrade);
   return cOpenControlCount.Total();}
#undef _FIRST
#undef _DELETE
#undef _NEXT
 

Очередной релиз.

1. Ждать от МК include guard'ов в стд бесполезно, думаю. Сделал сам. Идея такая - при первой коимпиляции (через F7 в виме) вся директория Include будет преобразована в utf-8 и будут добавлены include guard во все файлы (при последующих запусках всё это делаться не будет). В compile_mql (это bash скрипт) вверху есть строчка, которая указывает поддиректории в Include, в которых скрипт ничего не правит. Ну идея такая, что пользовательские данные не трогать.

#!/bin/bash
#home page - https://www.mql5.com/ru/users/vict

user_include_subdir=""
...

Возможные значения:

* пустая (дефолтно) - функция отключена (гуарды не добавляются, кодировка не меняется)

* одна директория user_include_subdir="any_dir"

* несколько директорий user_include_subdir="{dir1,dir2}"

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

user_include_subdir="myincl"

и во все mqh в ~/.wine/MQL5/Include/myincl и поддиректориях не будут добавляться guard'ды. Теперь можно подключать стд заголовки обычным способом + clang будет давать подсказки по типам оттуда.

ЗЫ: ссылка на последнюю версию в профиле


#vim_as_mql_ide_2

Файлы:
 
Vict:

Очередной релиз.

1. Ждать от МК include guard'ов в стд бесполезно, думаю. Сделал сам. Идея такая - при первой коимпиляции (через F7 в виме) вся директория Include будет преобразована в utf-8 и будут добавлены include guard во все файлы (при последующих запусках всё это делаться не будет). В compile_mql (это bash скрипт) вверху есть строчка, которая указывает поддиректории в Include, в которых скрипт ничего не правит. Ну идея такая, что пользовательские данные не трогать.

Возможные значения:

* пустая (дефолтно) - функция отключена (гуарды не добавляются, кодировка не меняется)

* одна директория user_include_subdir="any_dir"

* несколько директорий user_include_subdir="{dir1,dir2}"

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

и во все mqh в ~/.wine/MQL5/Include/myincl и поддиректориях не будут добавляться guard'ды. Теперь можно подключать стд заголовки обычным способом + clang будет давать подсказки по типам оттуда.

ЗЫ: ссылка на последнюю версию в профиле


#vim_as_mql_ide_2

Инклюд гарды в стд в виме с заголовками и подсказками типов. Умно молчу и осмысливаю.))) Осенила идея - может МК просто не знают о чем речь?))) Пользователи чего то хотят, а что - непонятно... Вот и не делают.))) Вы объясните на популярном русском что имеете ввиду и может сделают.))
 
Vict:

Очередной релиз.


остаётся прикрутить m4 препроцессором и получать ex4/5 из уникального винигрета :-)

решение не переносимо (без мата по крайней мере) даже между парой комплектов linux+wine+metatrader. Результирующие исходники будут прибиты гвоздями к IDE в виде vim/clang.

 
Maxim Kuznetsov:

решение не переносимо (без мата по крайней мере) даже между парой комплектов linux+wine+metatrader. Результирующие исходники будут прибиты гвоздями к IDE в виде vim/clang.

Нет, требования только "~/.wine/drive_c/Program Files/MetaTrader 5" и ссылка на MQL5. Разве это гвоздями? И то, я поторопился, можно было требовать лишь ссылку MQL5 в нужном месте (может допилю).

А compile_mql - обычный bash скрипт, можно смотреть/править. На крайняк выполнить sed команды с номерами строк 68-70 (в релизе 2) над исходниками и получить обратно пригодный для метаэдитора код.

А вообще вопросы неправильные у вас появились, интереснее другие - я вот за пару дней на коленках сделал ide со всеми плюшками и значительно более высоким качеством нежели метаэдитор (ну тот же автокмплит шаблонов, МЭ его до сих пор не умеет и по словам Рената это сложно, детский препроцессор, а функциональность вима вообще выше на порядок) над которым трудится целая команда кодеров и уже не первый год и за приличное вознаграждение. Можно даже весь мкл компилятор на clang сменить. Да, эффективный частный бизнес, все изображают важную деятельность, а по факту колесо переизобретают.

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

 
Vict:

Нет, требования только "~/.wine/drive_c/Program Files/MetaTrader 5" и ссылка на MQL5. Разве это гвоздями? И то, я поторопился, можно было требовать лишь ссылку MQL5 в нужном месте (может допилю).

А compile_mql - обычный bash скрипт, можно смотреть/править. На крайняк выполнить sed команды с номерами строк 68-70 (в релизе 2) над исходниками и получить обратно пригодный для метаэдитора код.

А вообще вопросы неправильные у вас появились, интереснее другие - я вот за пару дней на коленках сделал ide со всеми плюшками и значительно более высоким качеством нежели метаэдитор (ну тот же автокмплит шаблонов, МЭ его до сих пор не умеет и по словам Рената это сложно, детский препроцессор, а функциональность вима вообще выше на порядок) над которым трудится целая команда кодеров и уже не первый год и за приличное вознаграждение. Можно даже весь мкл компилятор на clang сменить. Да, эффективный частный бизнес, все изображают важную деятельность, а по факту колесо переизобретают.

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

если верно понял, всё равно желательно ставить guard`s и остаются ещё особые требованию к коду ?

с одной стороны дело хорошее - почему-бы и нет. Я и сам проекты более 2-х файлов собираю через make :-)

не обижайтесь - это не критика ради неё, это обсуждение

PS/ тут 9 из 10 не смогут "выйти из VIM" по доброй воле, кроме как отключив питание :-)