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

 
Swan >> :

erro 130 o tempo todo.

O StopLevel deve ser verificado, para StopLoss e Enter.


e também

deve ser escolhido o mais alto?


-130 provavelmente por causa de uma tentativa de definir uma ordem pendente, e o preço foi acima ou abaixo) no código, há linhas não comentadas com o nível de Mercado... este é o acompanhamento de preço futuro, portanto não há este erro)

-Menos baixo ou mais alto de OrderOpenPrice para parar) Se comprar, mais baixo H4 baixo de 0 vela e 1 vela... e a maior alta para uma venda... Geralmente mais baixo/alto para parar

 
ALex2008 >> :

-130 provavelmente por causa de uma tentativa de estabelecer uma ordem pendente, e o preço subiu ou desceu) no código há linhas não comentadas com o nível de Mercado... este é o acompanhamento de preço futuro, de modo que não há este erro).

-Menos baixo ou mais alto do OrderOpenPrice para parar) Se comprar, escolha o H4 mais baixo de 0 vela e 1 vela... e a maior alta para uma venda... Em geral, o mais baixo para baixo/alto para parar

Para consertá-la, agora vá para a maior baixa para comprar e para a menor alta para vender.

ou como segue

StopLoss=MathMin(b0,b1);
StopLoss=MathMax(s0,s1);
 
Swan >> :

Nada a corrigir, agora o mais baixo é escolhido para comprar, e o mais baixo para vender.

Logicamente é, tudo bem!) Esta é a escolha para a parada (é escolhida a menor em ppt. das duas opções)

Exemplo:


Mas sua versão é melhor e mais simples... Vou usá-la, mas vice versa.

StopLoss=MathMax(b0,b1);
StopLoss=MathMin(s0,s1);

Corrigido o código na página 5.

 
ALex2008 >> :

Logicamente é, tudo bem!) Esta é a escolha para parar (é escolhida a menor em ppt. das duas opções)



Taki para comprar o menor)

imho melhor o maior e arrasto na primeira barra, lógica diferente :)


StopLevel.

você pode mudar Enter

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)
      {
      DellAllOrders();
      Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
      if( Enter-Ask< StopLevel) Enter=Ask+ StopLevel;
      OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Enter+ Profit, 0, 0,0, Green);
      }
   }

ou abrir um pedido

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)
      {
      DellAllOrders();
      Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
      if( Enter-Ask< StopLevel)
      OrderSend(Symbol(), OP_BUY, 0.1, Ask, 0, 0, Ask+ Profit, 0, 0,0, Green);
      else 
      OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Enter+ Profit, 0, 0,0, Green);
      }
   }

ou pensar em algo mais)

 
Swan писал(а) >>

taki para comprar o menor)

é melhor comprar com a mais alta e arrasto na primeira barra, lógica diferente :)

Com StopLevel.

você pode mudar Enter

ou abrir um pedido

ou você pode inventar algo mais).

O preço em aberto deve ser mais adiantado pelo StopLevel da Bid or Ask. A partir do preço aberto, tomar as posições Take and Stop, que também não devem estar mais próximas do que o StopLevel. Mas para eles podemos usar o bloco fechado por lucro ou drawdown.

 
Swan >> :

...imho melhor a maior e arrasto a primeira barra, lógica diferente :)

Fez assim também... mas o resultado do teste é melhor na parada atual)

 

Corrigido o stopplay...

//-------Поиск входа для установки ордеров, удаление старых ордеров и установка новых
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)){
         DellAllOrders();
         Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
         if(Ask<= Enter- StopLevel){
         RefreshRates();
         OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Enter+ Profit, 0, 0,0, Green);}
      }
  }
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)){
         DellAllOrders();
         Enter=iLow(NULL,PERIOD_H4,1)-10*Point;
         if(Bid>= Enter+ StopLevel){
         RefreshRates();
         OrderSend(Symbol(), OP_SELLSTOP, 0.1, Enter, 0, 0, Enter- Profit, 0, 0,0, Green);}
      }
  }

   
//-------Вычисление стопа и утановка
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){
            StopLoss=MathMax( b0, b1);//Функция возвращает максимальное из двух числовых значений
            if(Bid- StopLoss< StopLevel) StopLoss=MathMin( b0, b1); 
            else OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
         }
         if( Type==1){
            StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
            if( StopLoss-Ask< StopLevel) StopLoss=MathMax( s0, s1);
            else OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
         }
   }


Swan >> :

...ou abrir uma ordem imediatamente.

(É muito mais seguro entrar com ordens pendentes) Caso contrário, sua empresa de corretagem ou nofarms o abrirá muito longe...)

>> ajustou o código.

 
ALex2008 >> :

Corrigido o stopgap...


(É melhor usar ordens pendentes) Caso contrário, o CD mostrará algo ou os nofarms o abrirão muito longe...))

>> fixou o código.

Consertar bugs antigos, adicionar novos :D


Fixou-o também)

//+------------------------------------------------------------------+
//|                                                    CandyLite.mq4 |
//|                                                    Ш.Александр.В |
//|                                              shestovav@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Ш.Александр.В"
#property link      "shestovav@gmail.com"

#include <stdlib.mqh>

extern double Profit = 3000;

int Type, Ticket;
double Stop, StopLevel, b0, b1, s0, s1, StopLoss, Enter;
bool dwn, up, mod;

int init(){
   Profit*=Point; 
   return(0);
  }

int deinit() {
   return(0);
  }

int start() {
   StopLevel=Point*MarketInfo(Symbol(),MODE_STOPLEVEL);   // вычисление стоплевел //Point*
   
   if(! WorkOrders()){
      UpTrend();
      DownTrend();
   }
      
   if( WorkOrders()){
      if (( Type<=1)&& ( Stop==0)) SetStop();
      if (( Type==1)||( Type==5)) UpTrend();
      if (( Type==0)||( Type==4)) DownTrend();
   }

   return(0);
  }
//-------Поиск входа для установки ордеров, удаление старых ордеров и установка новых
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)){
         DellAllOrders();
         Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
         if(Ask< Enter- StopLevel+0.5*Point){
         OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Enter+ Profit, 0, 0,0, Green);}
      }
  }
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)){
         DellAllOrders();
         Enter=iLow(NULL,PERIOD_H4,1)-10*Point;
         if(Bid> Enter+ StopLevel-0.5*Point){
         OrderSend(Symbol(), OP_SELLSTOP, 0.1, Enter, 0, 0, Enter- Profit, 0, 0,0, Green);}
      }
  }

//-------Вычисление стопа и установка
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){
            StopLoss=MathMax( b0, b1);//Функция возвращает максимальное из двух числовых значений
            if(Bid- StopLoss< StopLevel-0.5*Point) StopLoss=MathMin( b0, b1); 
            if(Bid- StopLoss> StopLevel-0.5*Point)//можно попробовать убрать строку
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
         }
         if( Type==1){
            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);
         }
   }
   
//-------Удаление всех ордеров, открытых и отложенных
void DellAllOrders(){
      if( WorkOrders()){
      if( Type<=1)OrderClose( Ticket,OrderLots(),OrderClosePrice(),10);
      else OrderDelete( Ticket);}
  }
  
//-------Поиск ордеров
bool WorkOrders(){
      for (int i=OrdersTotal()-1; i>=0; i--){
      if (!OrderSelect( i, SELECT_BY_POS))  continue;
      if (OrderSymbol()!=Symbol())        continue;
      Type  = OrderType();
      Ticket=OrderTicket();
      Stop  =OrderStopLoss();
      return(true);}
  return(false);
  }
 
Swan >> :

Consertar bugs antigos, adicionar novos :D

para quê?

0.5*Point

E MarketInfo() retorna tipo duplo, por que convertê-lo para Ponto...?

Isso também... duas condições.


if(Bid- StopLoss< StopLevel-0.5*Point) StopLoss=MathMin( b0, b1); 
if(Bid- StopLoss> StopLevel-0.5*Point)//можно попробовать убрать строку

Acho que foi tudo o que notei. É melhor explicar o que foi mudado para) Para que eu possa ter isso em mente para o futuro).

 
ALex2008 >> :

Eu não entendo...)

E MarketInfo() retorna tipo duplo, por que convertê-lo para Ponto...?

Este também...


0,5*Point é um delta, você também pode convertê-lo para 0,7 :)

Veja a comparação de números reais.

provavelmente funcionará corretamente sem ele. na maioria dos casos)


o erro foi

MarketInfo(Symbol(),MODE_STOPLEVEL)

retorna um valor em pips. multiplicado por Ponto.


Foi

            if(Bid- StopLoss< StopLevel) StopLoss=MathMin( b0, b1); 
            else OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

se for atribuído um novo valor ao verdadeiro StopLoss,

Caso contrário, o pedido é modificado.

sem erros, mas tenho que tirar uma cruz ou vestir calças)