E vamos fazer um "desenho animado" (multicurrency) - página 7

 
Swan >> :

Foi

Quando o StopLoss é verdadeiro, o novo valor é atribuído,

caso contrário, o pedido é modificado.

sem erros, mas você tem que tirar uma cruz ou vestir calças).

Eu não percebi logo))... a condição pode não causar uma parada!

Talvez devêssemos simplesmente remover outro? Parece que a lógica não sofre... Por que eu preciso da segunda condição se apenas uma é suficiente?

StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

Ou assim...

if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
if( StopLoss-Ask> StopLevel-0.5*Point) StopLoss=MathMin( s0, s1);
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);


Cisne >> :

ver comparação de números reais.

Vou lê-lo... Então, isso é absolutamente necessário? Eu simplesmente nunca o fiz).

 
ALex2008 >> :

Eu não entendi logo... A condição pode não causar uma parada!

Não podemos simplesmente remover outro? Parece que a lógica não sofre...

Talvez) a vela de 4h seja geralmente maior que a StopLevel.


ALex2008 >> :

Eu vou ler... Isto é, é necessário? Eu nunca o fiz dessa maneira)

todos os tipos de coisas estranhas acontecem quando os valores comparados são quase iguais)

ao verificar um número do tipo duplo para igualdade - obrigatório.


 StopLoss-Ask< StopLevel-0.5*Point

Em russo: StopLoss menos Ask é menos que StopLevel com precisão 0,5*Point

(StopLoss,Ask,StopLevel são normalizados)

 
StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
//StopLoss может присвоиться новое значение, желательно и его проверить на StopLevel
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
É um pouco confuso, mas você tem que pensar nisso).
 

E quanto a esta opção? Parece razoável mantê-lo...

if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
if( StopLoss-Ask> StopLevel-0.5*Point) StopLoss=MathMin( s0, s1);
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

Devemos também verificar o contexto comercial, caso contrário, recebemos erros de que está ocupado - TradeDispatcher: o contexto comercial está ocupado ... Acontece que se houver muitas cópias da EA, todas elas fecham simultaneamente a ordem atual em seus símbolos e estabelecem novas... um engarrafamento de trânsito formará)

é provavelmente assim que funciona...

//-------Поиск входа для установки ордеров, удаление старых ордеров и установка новых
void UpTrend(){
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) <= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) > 0)){
         Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
         if(IsTradeAllowed()){
            DellAllOrders();
            if(Ask< Enter- StopLevel+0.5*Point){
               OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Enter+ Profit, 0, 0,0, Green);}
         else Sleep(1000);
         }
      }
  }
void DownTrend(){
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) >= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) < 0)){
         Enter=iLow(NULL,PERIOD_H4,1)-10*Point;
         if(IsTradeAllowed()){
            DellAllOrders();
            if(Bid> Enter+ StopLevel-0.5*Point){
               OrderSend(Symbol(), OP_SELLSTOP, 0.1, Enter, 0, 0, Enter- Profit, 0, 0,0, Green);}
         else Sleep(1000);
         }
      }
  }

Isto é, antes de fechar a ordem atual e estabelecer uma nova ordem pendente, verificamos o fluxo comercial... Se estiver ocupado, faça uma pausa de 1 segundo.

 
ALex2008 >> :

E quanto a esta opção? Parece sensato mantê-lo...

if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
if( StopLoss-Ask> StopLevel-0.5*Point) StopLoss=MathMin( s0, s1);
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

Não, não é. Temos que tomar uma decisão).

três opções:

            StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
            if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
            if( StopLoss-Ask> StopLevel-0.5*Point)
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

            StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
            if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=Ask+ StopLevel;//+x*Point
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

            StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
            if( StopLoss-Ask> StopLevel-0.5*Point)
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

ALex2008 escreveu >>

Além disso, precisamos verificar o fio condutor do comércio, caso contrário, pode haver erros por estar ocupado... Porque se há muitos gráficos, todos eles fecham as ordens atuais ao mesmo tempo.
int start() {
   if(!IsTradeAllowed()) return(0);

se não ajudar, antes de todos os OrderSend,OrderModify,OrderClose,OrderDelete check IsTradeContextBusy()


ALex2008 >>:
Somente onde colocá-lo corretamente eu acho... Quero dizer, por exemplo, as ordens antigas não são apagadas porque o fio está ocupado, mas o programa deve colocar novas... E o programa só deve colocar novas quando todas as ordens antigas tiverem sido apagadas.

nas funções UpTrend() e DownTrend() verificar condições, os pedidos são removidos e colocados,

muitas coisas diferentes)

 
Swan >> :

Não, é assim que funciona. >> você tem que tomar uma decisão).

Não entendo, vai ou não vai?)

 
ALex2008 >> :

Eu não entendo - vai funcionar ou não?))

*não vai acontecer.

Em sua última variante.

         if( Type==0){
            if(Bid- StopLoss< StopLevel-0.5*Point) StopLoss=MathMin( b0, b1); 
            if(Bid- StopLoss> StopLevel-0.5*Point) StopLoss=MathMax( b0, b1);
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

no primeiro if() StopLoss não está definido.

 
Swan >> :

*não vai acontecer.

Em sua última variante.

no primeiro if() StopLoss não está definido.


Então o que é isso?

no primeiro se, a parada leva o mínimo (ao preço) de 2 castiçais... ou seja, longe do pedido

StopLoss=MathMin(b0,b1); 

no segundo se a parada receber a máxima (ao preço) baixa de 2 castiçais, ou seja, se estiver próxima da ordem


StopLoss=MathMax(b0,b1);
 
ALex2008 >> :
         if( Type==0){
//здесь StopLoss нипанятно какой)
            if(Bid- StopLoss< StopLevel-0.5*Point) StopLoss=MathMin( b0, b1); 
            if(Bid- StopLoss> StopLevel-0.5*Point) StopLoss=MathMax( b0, b1);
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
 

//здесь StopLoss нипанятно какой)

O que exatamente não está claro? É zero ao entrar na função. Talvez eu não entenda algo....


Acima há uma condição - Se o pedido estiver aberto e sua parada = 0, então coloque uma parada

if ((Type<=1)&&(Stop==0))SetStop();

e a função em si para definir uma parada


//-------Вычисление стопа и установка
void SetStop(){
      RefreshRates();
      b0=iLow(NULL,PERIOD_H4,0)-10*Point;
      b1=iLow(NULL,PERIOD_H4,1)-10*Point;
      s0=iHigh(NULL,PERIOD_H4,0)+(Ask-Bid)+10*Point;
      s1=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
            
         if( Type==0){
            if(Bid- StopLoss< StopLevel-0.5*Point) StopLoss=MathMin( b0, b1); 
            if(Bid- StopLoss> StopLevel-0.5*Point) StopLoss=MathMax( b0, b1);
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
         }
         if( Type==1){
            if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
            if( StopLoss-Ask> StopLevel-0.5*Point) StopLoss=MathMin( s0, s1);
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
         }
   }