Y hagamos una "caricatura" de ello (multidivisa) - página 6

 
Swan >> :

error 130 todo el tiempo.

StopLevel debe ser revisado, para StopLoss y Enter.


y también

¿se debe elegir el más alto?


-130 probablemente debido a un intento de establecer una orden pendiente, y el precio subió o bajó) en el código, hay líneas sin comentar con Marketlevel... este es el seguimiento del precio futuro, por lo que no hay este error)

-El mínimo o el máximo de OrderOpenPrice para el stop) Si compra, el mínimo H4 de la vela 0 y la vela 1... y el más alto para una venta... Por lo general, el más bajo/alto para la parada

 
ALex2008 >> :

-130 probablemente debido a un intento de establecer una orden pendiente, y el precio subió o bajó) en el código hay líneas sin comentar con Marketlevel... este es el seguimiento del precio futuro, para que no haya este error).

-El mínimo o el máximo de OrderOpenPrice para el stop) Si compra, elija el mínimo H4 de la vela 0 y la vela 1... y el más alto para una venta... En general, el mínimo/alto de la parada

Para solucionarlo, ahora ve al mínimo más alto para comprar y al máximo más bajo para vender.

o como sigue

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

Nada que corregir, ahora para comprar se elige el mayor mínimo, y el menor máximo para vender.

Lógicamente lo es, ¡de acuerdo!) Esta es la elección para el tope (se elige el más pequeño en ppt. de las dos opciones)

Ejemplo:


Pero tu versión es mejor y más sencilla... Lo usaré, pero viceversa.

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

Se ha corregido el código de la página 5.

 
ALex2008 >> :

Lógicamente lo es, ¡de acuerdo!) Esta es la elección para la parada (se elige la más pequeña en ppt. de las dos opciones)



Taki para comprar el más pequeño)

imho mejor el más grande y arrastre en la primera barra, diferente lógica :)


StopLevel.

se puede cambiar 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);
      }
   }

o abrir un 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);
      }
   }

o pensar en otra cosa)

 
Swan писал(а) >>

taki para comprar el más pequeño)

imho mejor comprar con el más alto y arrastrar en la primera barra, diferente lógica :)

Con StopLevel.

se puede cambiar Enter

o abrir un pedido

o puede que se le ocurra otra cosa).

El precio de apertura debe estar más lejos por StopLevel de Bid o Ask. A partir del precio de apertura tome las posiciones Take y Stop que tampoco deben estar más cerca del StopLevel. Pero para ellos podemos utilizar el bloque de cierre por ganancia o por reducción.

 
Swan >> :

...imho mejor el más grande y arrastrar la primera barra, diferente lógica :)

También lo hice así... pero el resultado de la prueba es mejor en la parada actual)

 

Corregido el juego de parada...

//-------Поиск входа для установки ордеров, удаление старых ордеров и установка новых
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 >> :

...o abrir un pedido directamente.

(Es mucho más seguro entrar con órdenes pendientes) De lo contrario, su empresa de corretaje o nofarms le abrirá muy lejos).

>> ajustó el código.

 
ALex2008 >> :

Corregida la parada...


(Es mejor utilizar las órdenes pendientes) De lo contrario, el DC mostrará algo o nofaros le abrirá muy lejos))

>> arreglado el código.

Arreglar viejos errores, añadir otros nuevos :D


También lo he arreglado)

//+------------------------------------------------------------------+
//|                                                    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 >> :

Arreglar viejos errores, añadir otros nuevos :D

¿para qué?

0.5*Point

Y MarketInfo() devuelve el tipo double, ¿por qué convertirlo en Point?

Eso también... dos condiciones.


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

Creo que eso es todo lo que noté. Es mejor explicar para qué se ha cambiado) Para que lo tenga en cuenta para el futuro).

 
ALex2008 >> :

No entiendo...)

Y MarketInfo() devuelve el tipo double, ¿por qué convertirlo en Point?

Este también...


0,5*Punto es un delta, también puedes convertirlo en 0,7 :)

Ver comparación de números reales.

probablemente funcionará correctamente sin ella. en la mayoría de los casos)


el error fue

MarketInfo(Symbol(),MODE_STOPLEVEL)

devuelve un valor en pips. multiplicado por Punto.


Fue

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

si es cierto se asigna un nuevo valor a StopLoss,

En caso contrario, se modifica el orden.

ningún error, pero tengo que quitarme una cruz o ponerme los pantalones)

Razón de la queja: