Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 811

 

Aquí necesitamos colocar órdenes pendientes y calcular sus precios en relación con el precio de cierre de la barra anterior. Se coloca el BUYSTOP, mientras que el SELLSTOP devuelve el error 130. ¿Hay algún error en este código? O en otra función.

void SetOrders() {

double ldStop=0, ldTake=0;
int spr=MarketInfo(Symbol(), MODE_SPREAD);
double PredBar=iClose(NULL,PERIOD_M5,1);
double pAsk=PredBar+(DistanceSet+spr)*Punto;
double pBid=PredBar-(DistanceSet+spr)*Punto;

if (!ExistOrder(1)) {
if (StopLoss!=0) ldStop=pAsk-StopLoss*Point;
if (TakeProfit!=0) ldTake=pAsk+TakeProfit*Point;
SetOrder(OP_BUYSTOP, pAsk, ldStop, ldTake, 1);
}
if (!ExistOrder(2)) {
if (StopLoss!=0) ldStop=PredBar+(StopLoss*Point);
if (TakeProfit!=0) ldTake=pBid-TakeProfit*Point;
SetOrder(OP_SELLSTOP, pBid, ldStop, ldTake, 2);
}
}
 
Pomid:

Aquí tenemos que colocar órdenes pendientes y calcular sus precios en relación con el precio de cierre de la barra anterior. Se coloca el BUYSTOP, mientras que el SELLSTOP devuelve el error 130. ¿Hay algún error en este código? O en otra función.

void SetOrders() {

  double ldStop=0, ldTake=0;
  int    spr=MarketInfo(Symbol(), MODE_SPREAD);
  double PredBar=iClose(NULL,PERIOD_M5,1);
  double pAsk=PredBar+(DistanceSet+spr)*Point;
  double pBid=PredBar-(DistanceSet+spr)*Point;

  if (!ExistOrder(1)) {
    if (StopLoss!=0) ldStop=pAsk-StopLoss*Point;
    if (TakeProfit!=0) ldTake=pAsk+TakeProfit*Point;
    SetOrder(OP_BUYSTOP, pAsk, ldStop, ldTake, 1);
  }
  if (!ExistOrder(2)) {
    if (StopLoss!=0) ldStop=PredBar+(StopLoss*Point);
    if (TakeProfit!=0) ldTake=pBid-TakeProfit*Point;
    SetOrder(OP_SELLSTOP, pBid, ldStop, ldTake, 2);
  }
}

¿Por qué no te diriges al autor? Todavía está vivo y es joven, no viejo. Las coordenadas se encuentran en el código por encima de cada función. Todo el mundo lo conoce y lo respeta.

¡Y aprende a insertar código como este, con SRC!

void SetOrders() {

  double ldStop=0, ldTake=0;
  int    spr=MarketInfo(Symbol(), MODE_SPREAD);
  double PredBar=iClose(NULL,PERIOD_M5,1);
  double pAsk=PredBar+(DistanceSet+spr)*Point;
  double pBid=PredBar-(DistanceSet+spr)*Point;

  if (!ExistOrder(1)) {
    if (StopLoss!=0) ldStop=pAsk-StopLoss*Point;
    if (TakeProfit!=0) ldTake=pAsk+TakeProfit*Point;
    SetOrder(OP_BUYSTOP, pAsk, ldStop, ldTake, 1);
  }
  if (!ExistOrder(2)) {
    if (StopLoss!=0) ldStop=PredBar+(StopLoss*Point);
    if (TakeProfit!=0) ldTake=pBid-TakeProfit*Point;
    SetOrder(OP_SELLSTOP, pBid, ldStop, ldTake, 2);
  }
}

Te has metido con PredBar sin entenderlo, ¡y este es el resultado! Aprende primero las matemáticas.

 
Buenas noches, podrían decirme cómo solucionar el problema del indicador que no funciona en la nueva compilación. Al compilar da error 'TotalOrders' - tipo de expresión de cambio ilegal (el error está resaltado en el código ). Saludos, alexander.
 for (i=0; i<k; i++)
   {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
    {
      if ((OrderSymbol()==Symb) && (OrderType()==op))
        {
            ko++;
            TotalOrders[ChartListPosition+1][ko][1]=NormalizeDouble(OrderOpenPrice(),dig);
            TotalOrders[ChartListPosition+1][ko][2]=NormalizeDouble(OrderStopLoss(),dig);
            TotalOrders[ChartListPosition+1][ko][3]=NormalizeDouble(OrderTakeProfit(),dig);
            TotalOrders[ChartListPosition+1][ko][4]=OrderTicket();
            TotalOrders[ChartListPosition+1][ko][5]=OrderLots();
            TotalOrders[ChartListPosition+1][ko][6]=OrderType();
            TotalOrders[ChartListPosition+1][ko][7]=OrderMagicNumber();
            TotalOrders[ChartListPosition+1][0][0]=ko;
           
              switch(TotalOrders[ChartListPosition+1][ko][6])
              {
               case OP_BUY:
                        Type="Buy";
                break;
                
               case OP_BUYSTOP:
                        Type="Buy Stop";

 for(int j=1;j<=OrdersCount;j++)  
      {
       
         switch(TotalOrders[ChartsListPosition+1][j][6])
          {
           case OP_SELL: 
               if (TotalOrders[ChartsListPosition+1][j][2]!=0 && 
                   ask>=(TotalOrders[ChartsListPosition+1][j][2]-NormalizeDouble(StopLevel*point,dig)))  
                   {
                    test=StopLossColor;
                   } 
                   else
                   {
                   if (TotalOrders[ChartsListPosition+1][j][3]!=0 && 
                       ask<=(TotalOrders[ChartsListPosition+1][j][3]+NormalizeDouble(StopLevel*point,dig)))
                      {
                       test=TakeProfitColor;
                      }
                   }
             break;       
 
karwin:
Buenas noches, podrían decirme cómo solucionar el problema del indicador que no funciona en la nueva compilación. Al compilar da error 'TotalOrders' - tipo de expresión de cambio ilegal (el error está resaltado en el código). Saludos, alexander.

La variable debería estar ahí, no otra cosa:

              int Переменная=TotalOrders[ChartListPosition+1][ko][6];
              switch(Переменная)
              {
               case OP_BUY:
                        Type="Buy";
                break;
                
               case OP_BUYSTOP:
                        Type="Buy Stop";
 

Hola camaradas.

Me pueden aconsejar, no estoy muy familiarizado con MT5, apenas lo he usado, mientras hago las pruebas sólo se activa un núcleo de la CPU, tengo 8, ¿por qué es eso? ¿Cómo lo arreglo?


 
7Konstantin7:

Hola camaradas.

Me pueden aconsejar, no estoy muy familiarizado con MT5, apenas lo he usado, mientras hago las pruebas sólo se activa un núcleo de la CPU, tengo 8, ¿por qué es eso? ¿Cómo lo arreglo?


Deberías preguntar en el quinto foro
 
7Konstantin7:

Hola camaradas.

Me pueden aconsejar, no estoy muy familiarizado con MT5, apenas lo he usado, mientras hago las pruebas sólo se activa un núcleo de la CPU, tengo 8, ¿por qué es eso? ¿Cómo lo arreglo?


¿Es para probar o para optimizar? Si sólo se está probando - un núcleo funciona, pero si se activa la opción "Optimizar" en el probador de estrategias, todos los núcleos del procesador funcionarán.
 
borilunad:

Te has metido con PredBar sin entender, ¡este es el resultado! Aprende primero las matemáticas.

Gracias, lo aprendí y lo corregí.
 
evillive:
deberías preguntarlo en el quinto foro

"No soy miembro del sitio, por eso hice la pregunta aquí.

barabashkakvn:
¿Es durante las pruebas o la optimización? Si sólo pruebas - un núcleo funciona, pero cuando activas la opción "Optimizar" en el probador de estrategias, se ejecutarán todos los núcleos del procesador.

Lo he entendido todo, gracias a todos. Durante la prueba un núcleo está funcionando y todo funciona como debe ser,

No puedo entender por qué no utilizaron toda la potencia del procesador en la prueba.

 
7Konstantin7:

"No soy miembro del sitio, por eso hice la pregunta aquí.

Lo he entendido todo, gracias a todos. Durante la prueba un núcleo está funcionando y todo funciona como debe ser,

No puedo entender por qué no utilizan toda la potencia del procesador en las pruebas.

¿Y por qué debemos cargar todos los núcleos durante las pruebas (sin la optimización activada)? Después de todo, si las pruebas con la visualización, no hay prisa, y si las pruebas sin la visualización - por lo que los ordenadores modernos realizar esta tarea como las semillas de girasol en un solo núcleo.
Razón de la queja: