Vim como ideal para mql - página 6

 
Vladimir Simakov :

Oi verde, não te vejo há anos)))) Onde está a sua comitiva?)))

Tudo isso é bom. Tudo está no lugar.

 
Dmitry Fedoseev:

Tudo isso é bom. Tudo está no lugar.

Você conseguiu. Eu nem sabia que tal linguagem existia até agora. Viva e aprenda!
 

Moderador, por que você teve que traduzi-lo à força? Apenas uma troca de cumprimentos entre dois velhos amigos, sim, não em russo, mas quem estiver interessado poderia traduzi-lo ele mesmo.

Para aqueles que não estão no assunto: eu escrevi em inglês chato, mas Dmitri realmente me impressionou, ele respondeu em puro Telugu, o que eu nem suspeitei. Mas, infelizmente, dirigiu um moderador)))).

Estava brincando.

 
Vladimir Simakov:

Moderador, por que você teve que traduzi-lo à força? Apenas uma troca de cumprimentos entre dois velhos amigos, sim, não em russo, mas quem estiver interessado poderia traduzi-lo ele mesmo.

Para aqueles que não estão no assunto: eu escrevi em inglês chato, mas Dmitri realmente me impressionou, ele respondeu em puro Telugu, o que eu nem suspeitei. Mas, infelizmente, um moderador veio correndo))))

Estava brincando.

Necessidade de escrever pelo menos uma medalha. Provavelmente esperando que alguém o chame para o escritório e lhe dê um certificado na frente de todos!


 
Vitaly Muzichenko:

Bem, não há nada de novo, tudo está em um círculo: "Aberto -> Derretido -> Fechado".

Era uma vez um estaleiro monolítico, como era há alguns anos: "Montei a cofragem -> Amarrei o vergalhão -> Descasquei o concreto -> Descasquei a cofragem" e assim por diante em círculo, porque nenhum outro é dado :)

Por que:

cPos=new CRealPosition(cParam);

É assim que a posição é ativada,

//----------------------------------------------------
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);}}

E é assim que ela é acompanhada. E isto é mql5, no mql4 o código seria idêntico. CRealPosição é:

#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);}

E a posição CP já faz parte da biblioteca que acompanha uma operação comercial (seja mql4 ou mql5, embora a rede ainda não esteja totalmente implementada) desde o início até o fechamento.

E sim, mais uma coisa, a enumeração de todas as posições que estão na grade, que é um operador de grade com lógica ramificada, é realizada da seguinte forma:

#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
 

Outro lançamento.

1. Esperar que a MK inclua guardas na std é inútil, eu acho. Fui eu mesmo que o fiz. A idéia é esta - durante a primeira co-implementação (via F7 em vime) todo o diretório Include será convertido para utf-8 e o Guard incluído será adicionado a todos os arquivos (nas próximas execuções isto não vai funcionar). Em compile_mql (que é um script bash) há uma linha no topo que especifica os subdiretórios em Include, onde o script não muda nada. Bem, a idéia é deixar os dados do usuário intocados.

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

user_include_subdir=""
...

Possíveis valores:

* vazio (padrão) - função desabilitada (sem guardas adicionados, sem codificação alterada)

* diretório único user_include_subdir="any_dir"

* múltiplos diretórios user_include_subdir="{dir1,dir2}"

Isto é, colocamos nesta variável diretórios onde vivem nossos próprios arquivos de cabeçalho. Por exemplo, eu tenho

user_include_subdir="myincl"

e em todos os mqh em ~/.wine/MQL5/Include/myincl e subdiretórios não serão adicionados. Agora você pode conectar os cabeçalhos std da maneira usual + clang darão dicas de tipo a partir daí.

ZS: link para a última versão do perfil


#vim_as_mql_ide_2

Arquivos anexados:
 
Vict:

Outro lançamento.

1. Esperar que a MK inclua guardas na std é inútil, eu acho. Fui eu mesmo que o fiz. A idéia é esta - durante a primeira co-implementação (via F7 em vime) todo o diretório Include será convertido para utf-8 e o Guard incluído será adicionado a todos os arquivos (nas próximas execuções isto não vai funcionar). Em compile_mql (que é um script bash) há uma linha no topo que especifica os subdiretórios em Include, onde o script não muda nada. Bem, a idéia é deixar os dados do usuário intocados.

Possíveis valores:

* vazio (padrão) - função desabilitada (sem guardas adicionados, sem codificação alterada)

* diretório único user_include_subdir="any_dir"

* múltiplos diretórios user_include_subdir="{dir1,dir2}"

Isto é, colocamos nesta variável diretórios onde vivem nossos próprios arquivos de cabeçalho. Por exemplo, eu tenho

e em todos os mqh em ~/.wine/MQL5/Include/myincl e subdiretórios não serão adicionados. Agora você pode conectar os cabeçalhos std da maneira usual + clang darão dicas de tipo a partir daí.

ZS: link para a última versão do perfil


#vim_as_mql_ide_2

Garda inlude em std em vim com cabeçalhos e avisos de tipo. Estou sendo inteligentemente silencioso e refletindo)))) Uma idéia me tocou - talvez os MCs simplesmente não saibam do que se trata?))) Os usuários querem algo, mas o que - não sabem ... Portanto, eles não.))). Você explica em russo popular o que você quer dizer e talvez o faça).
 
Vict:

Outro lançamento.


a única coisa que resta é parafusar no pré-processador m4 e obter ex4/5 de um vinigrette único :-)

a solução não é portátil (sem mate, pelo menos) mesmo entre um par de kits linux+wine+metatrader. O código fonte resultante será pregado na IDE como vim/clang.

 
Maxim Kuznetsov:

A solução não é portátil (sem mate, pelo menos) mesmo entre um par de suítes linux+wine+metatrader. O código fonte resultante será pregado na IDE como vim/clang.

Não, os requisitos são apenas "~/.wine/drive_c/Program Files/MetaTrader 5" e um link para MQL5. É um prego? Eu era muito apressado, só podia exigir o link MQL5 no lugar certo (posso terminá-lo).

O compile_mql é um script bash padrão, você pode vê-lo/editá-lo. Como último recurso, executar comandos sed com as linhas 68-70 (no release 2) sobre as fontes e recuperar o código adequado para o metaeditor.

E, em geral, suas perguntas estão erradas, outras mais interessantes - eu fiz ide com todos os bons e de qualidade muito superior ao meta editor (bem, os mesmos modelos autocompletados, ME ainda não pode fazê-lo e, de acordo com Renat, é difícil, pré-processador infantil, e funcionalidade vim geralmente ordem superior) sobre o qual trabalhou toda a equipe de codificadores e não no primeiro ano e por uma taxa decente. Você pode até mesmo mudar o compilador de µl inteiro para ressoar. Sim, negócio privado eficiente, todos fingem ser atividades importantes, mas na verdade a roda é reinventada.

E deixe-me contar um segredo - não conto com a milionésima audiência, se um par de nerds a usar, não é ruim. O resto continuará a rezar ao MC, obedientemente colocando amperesands na frente de arrays e desreferenciando através de um ponto.

 
Vict:

Não, os requisitos são apenas "~/.wine/drive_c/Program Files/MetaTrader 5" e um link para MQL5. É um prego? Eu era muito apressado, só podia exigir o link MQL5 no lugar certo (posso terminá-lo).

O compile_mql é um script bash padrão, você pode vê-lo/editá-lo. Como último recurso, executar comandos sed com as linhas 68-70 (no release 2) sobre as fontes e recuperar o código adequado para o metaeditor.

E, em geral, suas perguntas estão erradas, outras mais interessantes - eu fiz ide com todos os bons e de qualidade muito superior ao meta editor (bem, os mesmos modelos autocompletados, ME ainda não pode fazê-lo e, de acordo com Renat, é difícil, pré-processador infantil, e funcionalidade vim geralmente ordem superior) sobre o qual trabalhou toda a equipe de codificadores e não no primeiro ano e por uma taxa decente. Você poderia até mesmo mudar todo o compilador de µl para ressoar. Sim, negócio privado eficiente, todos fingem ser atividades importantes, mas na verdade eles reinventam a roda.

Bem, vou contar um segredo - não conto com a milionésima audiência, se um par de nerds a usar, não é ruim. O resto continuará a rezar ao MC, colocando obedientemente amperesands em frente a arrays e desreferenciando via ponto.

Se eu acertei, ainda é desejável colocar guardas e ainda há exigências especiais para o código ?

Por um lado, é bom - por que não? Eu mesmo construo projetos com mais de 2 arquivos através da marca :-)

Sem ofensa - não é uma crítica por causa disso, é uma discussão

PS/ aqui 9 de 10 não poderão "sair do VIM" voluntariamente, exceto para desligar a energia :-)

Razão: