[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 141

 
artmedia70:

IMHO - é melhor encontrar seu pedido e ver se ele está no mercado ou fechado, e como ele fechou, no take, stop ou manualmente. A partir daqui, você deve começar a dançar em diferentes direções.

Então tudo será preciso. Mas variáveis globais podem ser perdidas...


O que você quer dizer com "perder variáveis"? Você quer dizer encontrá-la para que a EA verifique isso também?
 
Begemot7:
Por favor, esclareça o que você quer dizer com perder variáveis, e encontre-o no sentido de que a EA verifique isso também?

Em todos os EAs para negociação real e demo, não armazeno dados importantes sobre ordens e posições em variáveis. O máximo que posso escrever os dados, o que é necessário para a lógica da EA, no comentário da ordem. Quando preciso descobrir se há posições, quantas há, se há ordens, posições fechadas, como elas fecharam, faço um loop sobre posições/ordens de mercado ou dados históricos, encontro a ordem que preciso e recupero as informações de que preciso. Desta forma, não guardo todas as informações importantes em variáveis, pois elas podem ser perdidas durante um desligamento inesperado do computador. Pode sempre ser recuperado mais tarde. Tentei armazená-la em variáveis globais de terminal - descobri que a informação nem sempre é salva lá quando o computador trava/hangs. E para mim, supervisionar constantemente a redação de novas informações é muito problemático... Acho mais fácil encontrar o que eu preciso no momento em que preciso.
 
PapaYozh:

Você pode obter as coordenadas do ponto em que o indicador foi descartado, utilizando as funções:

WindowXOnDropped()

WindowYOnDropped()

Preço e tempo:

WindowPriceOnDropped()

WindowTimeOnDropped()


Vou tentar construí-la. Um exemplo seria semelhante...
 

Estou diante de uma situação estranha. Poderia me dizer, por favor...

Existem três EAs autoescritas. A estratégia é a mesma, apenas uma implementação diferente, dependendo do instrumento. Pares: EURUSD, EURGBP e USDJPY. Tenho uma boa relação de trabalho com os dois primeiros, mas o último não está funcionando. A corretora é FX-Trend. Minha conta é uma mini com o lote mínimo de 0,01 (tem sido usada até agora para testes).

Ao mesmo tempo: Tudo está bem em uma conta de demonstração. Quando o tester é executado, as negociações são abertas na mesma conta real no tester. Mas eles não o fazem durante o comércio real. Os marcadores do gráfico de abertura de pedidos (e todos os outros marcadores) são colocados com sucesso. Não há absolutamente nada nos troncos.

Tudo isso funciona com um VPS.


Acho que esta é toda a informação. Ficaria grato por qualquer dica sobre a direção a ser tomada.

 
Sepulca:

Melhor assim (caso a EA seja reiniciada):



Se houver apenas um pedido, podemos passar sem ele.


if(OrdensTotal()<1)

{

}

......

 
artmedia70:
Não guardo dados importantes sobre pedidos e posições em variáveis em todos os EAs para real e demo. O máximo que posso escrever os dados necessários para a lógica da EA está no comentário da ordem. Quando preciso descobrir se há posições, quantas há, se há ordens, posições fechadas, como elas fecharam, faço um loop sobre posições/ordens de mercado ou dados históricos, encontro a ordem que preciso e recupero as informações de que preciso. Desta forma, não guardo todas as informações importantes em variáveis, pois elas podem ser perdidas durante um desligamento inesperado do computador. Pode sempre ser recuperado mais tarde. Tentei armazená-la em variáveis globais de terminal - descobri que a informação nem sempre é salva lá quando o computador trava/hangs. E para mim, supervisionar constantemente a redação de novas informações é muito problemático... Acho mais fácil encontrar o que eu preciso no momento em que preciso.

Isso mesmo... ...para ficar mais tranqüilo. É mais correto, é claro, passar por todas as ordens. Mas este é um caso específico. Se perdemos a GlobalVariables, devemos deixar esta empresa de corretagem. As GlobalVariables não são armazenadas em seu computador, mas na corretora por até três meses se você as deixar intocadas. Ou eu estou errado?
 
Parece que eu descobri por mim mesmo :). É verdade o que eles dizem - o principal é formulá-lo. Em geral, quando executamos no mercado, estabelecemos paradas e tomamos posições a zero. E então a ajustamos corretamente. Talvez alguém o ache útil...
 
Sepulca:
Isso mesmo... segurança extra. A coisa certa a fazer, é claro, é passar por todas as ordens. Mas este é um caso específico. E se a GlobalVariables se perder, devemos deixar esta empresa de corretagem.

O que você quer dizer - esta empresa de corretagem faz isso de propósito? Foi-me dito que o MT4 é um terminal que pode ser facilmente controlado pelo corretor e, portanto, pode haver muita trapaça, quem já ouviu falar sobre ele?
 
Begemot7:

O CD faz isso de propósito? Foi-me dito que o MT4 é um terminal que pode ser facilmente controlado por um corretor e, portanto, muita trapaça é possível, quem já ouviu falar disso?


Eu realmente não entendo. Para que serve a DC destruir suas variáveis globais, a menos, é claro, que você tenha construído um monte delas x....... Citação da documentação:
"Variáveis globais do terminal do cliente não devem ser misturadas com variáveis declaradas no escopo global do programa MQL4. Existem variáveis globais no terminal do cliente por 4 semanas desde o último acesso, após as quais elas são automaticamente apagadas. O acesso a uma variável global não é apenas a definição de um novo valor, mas também a leitura do valor da variável global. As variáveis globais do terminal do cliente são acessíveis simultaneamente a partir de todos os programas MQL4 lançados no terminal do cliente. "Se você estiver trabalhando com lote 0,01 ou 0,1, ninguém o oprimirá, porque é uma pequena coisa.... Mas se você abriu 100 lotes na conta real, é melhor estar pronto para lutar por seu dinheiro.

 

Precisa da ajuda dos profissionais!!! Já me arrebentava o cérebro com este código. Há 4 buffers 2 deles funcionam corretamente (Buffer &buffer2), mas os outros 2 não funcionam. Quando uma determinada condição ocorre, o buffer é preenchido, quando este valor sobe para um e desce para o segundo, os buffers são removidos (zerados), mas os 2 buffers restantes ainda estão pendurados na tabela. Você pode me dizer como consertá-lo?

      //--- Функция расчета буферов CountZZ(BuferUp,BuferDn,iPeriod,Dev,Step);
int CountZZ( double& ExtMapBuffer[], double& ExtMapBuffer1[], double& ExtMapBuffer2[], double& ExtMapBuffer3[], int ExtDepth, int ExtDeviation, int ExtBackstep )
{
   int    shift, back,lasthighpos,lastlowpos;
   double val,res;
   double curlow,curhigh,lasthigh,lastlow,lastlow1,lasthigh1;
   int count = iBars(pair,tf)-ExtDepth;

   for(shift=count; shift>=0; shift--)
     {
     //--- Расчитываем буфер BuferUp
      val = iLow(pair,tf,iLowest(pair,tf,MODE_LOW,ExtDepth,shift));
      if(val==lastlow) val=0.0;
      else
        {
         lastlow=val;
         if((iLow(pair,tf,shift)-val)>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtMapBuffer[shift+back];
               if((res!=0)&&(res>val)) ExtMapBuffer[shift+back]=0.0;
              }
           }
        }
       
          ExtMapBuffer[shift]=val;
      //--------------------------------------------------------------------    
          
     //--- Расчитываем буфер BuferUp2
      if (ExtMapBuffer[shift]>0.0)
      {
             if(use.narrow.bands) val = MathMin(iClose(pair,tf,shift),iOpen(pair,tf,shift));
                else {val = MathMax(iClose(pair,tf,shift),iOpen(pair,tf,shift));
             val = MathMin(val,MathMin(iHigh(pair,tf,shift+1),iHigh(pair,tf,shift-1)));}
      if(ExtMapBuffer[shift+back]==0.0) ExtMapBuffer1[shift+back]=0.0;
      } 
          ExtMapBuffer1[shift]=val;
      //--------------------------------------------------------------------    
          
      //--- Расчитываем буфер BuferDn
      val=iHigh(pair,tf,iHighest(pair,tf,MODE_HIGH,ExtDepth,shift));
     
      if(val==lasthigh) val=0.0;
      else
        {
         lasthigh=val;
         if((val-iHigh(pair,tf,shift))>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtMapBuffer2[shift+back];
               if((res!=0)&&(res<val)) ExtMapBuffer2[shift+back]=0.0;
              }
           }
        }
      ExtMapBuffer2[shift]=val;
      //-------------------------------------------------------------------
      
      //--- Расчитываем буфер BuferDn2
      if (ExtMapBuffer2[shift]>0.0)
      {
             if(use.narrow.bands) val = MathMax(iClose(pair,tf,shift),iOpen(pair,tf,shift));
                else {val = MathMin(iClose(pair,tf,shift),iOpen(pair,tf,shift));
             val = MathMax(val,MathMax(iLow(pair,tf,shift-1),iLow(pair,tf,shift+1)));}
      if(ExtMapBuffer2[shift+back]==0.0) ExtMapBuffer3[shift+back]=0.0;
      }
      ExtMapBuffer3[shift]=val;
      //-------------------------------------------------------------------
      
     }
           
   // Отсееваем ненужные значения
   lasthigh=-1; lasthighpos=-1;
   lastlow=-1;  lastlowpos=-1;

   for(shift=count; shift>=0; shift--)
     {
      curlow=ExtMapBuffer[shift];
      curhigh=ExtMapBuffer2[shift];
      if((curlow==0)&&(curhigh==0)) continue;
      //---
      if(curhigh!=0)
        {
         if(lasthigh>0)
           {
            if(lasthigh<curhigh) ExtMapBuffer2[lasthighpos]=0;
            else ExtMapBuffer2[shift]=0;
           }
         //---
         if(lasthigh<curhigh || lasthigh<0)
           {
            lasthigh=curhigh;
            lasthighpos=shift;
           }
         lastlow=-1;
        }
      //----
      if(curlow!=0)
        {
         if(lastlow>0)
           {
            if(lastlow>curlow) ExtMapBuffer[lastlowpos]=0;
            else ExtMapBuffer[shift]=0;
           }
         //---
         if((curlow<lastlow)||(lastlow<0))
           {
            lastlow=curlow;
            lastlowpos=shift;
           }
         lasthigh=-1;
        }
     }
 
   for(shift=iBars(pair,tf)-1; shift>=0; shift--)
   {
      if(shift>=count) ExtMapBuffer[shift]=0.0;
         else
         {
            res=ExtMapBuffer2[shift];
            if(res!=0.0) ExtMapBuffer2[shift]=res;
         }
   }
}

Razão: