[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 277

 
evillive:

¡Buenas tardes!

Por favor, aconséjenme una forma fiable de identificar un piso, si es que lo hay.

Lo hay. Esta semana también voy a cobrar de verdad en base a ello.
 
evillive:

¡Buenas tardes!
Por favor, aconséjenme una forma fiable de identificar un piso, si es que lo hay.

Un piso es un movimiento de precios que consiste en uno o más elementos planos.
Un elemento plano es un elemento del movimiento del precio que se forma cuando el precio se mueve en cualquier dirección desde su punto de partida con posterior retroceso del precio a este punto.

 

Para la entrega del pedido se utiliza el siguiente comando

tikett= OrderSend( Symbol(), OP_SELLSTOP,  volume*A, Price -otstup*Point, Point* 3,R2, Price-takeprofit*Point-otstup*Point, "OP_SELLSTOP" , 2000,  expiration,C'0,128,255' );

El comando OrderSend ordena al robot que coloque la orden; el par de divisas se escribe entre paréntesis en la primera posición. Aquí tenemos Symbol() que nos da el par de divisas donde se ha colocado el Asesor Experto. A continuación se indica el nombre de la operación comercial. Luego tenemos el volumen del lote y tenemos un multiplicador variable aquí. Precio, luego una desviación de 3 pips, Stop Loss, Take Profit, nombre, número mágico - cualquier número que haya elegido, luego no recuerdo, luego color. Todo está en este orden. Puede prescindir de tikett=, sólo de OrderSend.

Y aquí, ¡atención! El pedido se hará en cada tic, hasta cientos de pedidos, si se acaba de escribir en el inicio. Necesitamos condiciones para que el pedido se realice cuando sea necesario. Ejemplo.

for ( i=OrdersTotal();i>0;i--){ OrderSelect(i-1,SELECT_BY_POS );//Alert ("OrderType( )", OrderType( ));
 if( OrderMagicNumber( )==2000 &&OrderSymbol()==Symbol()) { 
if(OrderType( ) ==OP_SELLSTOP) { Y++;}
if(OrderType( ) ==OP_SELL) { Y++;}}}
Y=Y-dolivka1;//Alert ("Y++", Y," dolivka1 ",dolivka1);
 if (Y<=0){ // Alert ("Y", Y );
   tikett= OrderSend( Symbol(), OP_SELLSTOP,  volume*A, Price -otstup*Point, Point* 3,R2, Price-takeprofit*Point-otstup*Point, "OP_SELLSTOP" , 2000,  expiration,C'0,128,255' );
   // Alert ("OP_SELLSTOP", GetLastError( )); 
    Error=GetLastError( ); } J=0;

   if (Error !=0 ) { Print ( " Error OP_SELLSTOP " , Error , "tikett",tikett," volume*A ",volume*A," Price -otstup*Point ",Price -otstup*Point," Price-takeprofit*Point-otstup*Point ",Price-takeprofit*Point-otstup*Point, 
  " Ask ", Ask , " Bid " , Bid );
   Error=0;}

Cansado. Utiliza la ayuda, para analizar los ejemplos listos.

 
drknn:


¿Lo has visto aquí? https://book.mql4.com/ru/samples/index

Generalmente, como cualquier otro programa, el suyo estará formado por bloques separados, cada bloque realiza una tarea. Tomamos uno de esos bloques y escribimos nuestro propio código, lo depuramos de cabo a rabo y pasamos al siguiente bloque. Y así hasta el final del programa.


Bueno, intentaré ser más específico... Mi Asesor Experto abre con éxito UNA orden pendiente y tiene que modificarla después de algún tiempo... Para ello, necesito conocer su índice o un número de posición en una orden pendiente. ¿Cómo puedo obtener este número de posición o su índice? ¿Hay que buscar los pedidos mediante un bucle for? Tengo una orden... Aquí está una parte del código de mi programa que no funciona


if (OrderSelect (1, SELECT_BY_POS, MODE_TRADES)==true)

{ticket = OrderTicket();

return();}

¿Cómo debo escribirlo correctamente?

 
AlexLaptist:


Y, sin embargo, intentaré plantear la cuestión con más precisión... Mi Asesor Experto abre con éxito UNA orden pendiente y después de algún tiempo tiene que modificarla... Para ello, necesitamos conocer su índice o un número de posición en las órdenes pendientes. ¿Cómo puedo obtener este número de posición o su índice? ¿Hay que buscar los pedidos mediante un bucle for? Tengo una orden... Aquí está una parte del código de mi programa que no funciona


if (OrderSelect (1, SELECT_BY_POS, MODE_TRADES)==true)

{ticket = OrderTicket();

return();}

¿Cómo lo escribo correctamente?


La función OrderSend(), si se ejecuta con éxito, devuelve el número del ticket de la orden que acaba de abrir - este es su número de secuencia en el servidor, y no hay ninguna otra orden de este tipo. Por lo tanto, no es necesario ejecutar un retroceso de la orden, sólo recordar su entrada. Recuérdalo en cuanto se abra el pedido.

int Ticket=OrderSend();
if(Ticket<0){
// тут принтуем сообщение об ошибке.
}
// Вам нужно всё равно создать счётчик ордеров, который обнулит переменную Ticket в том случае, если ордера в рынке больше нет.
 
drknn:


La función OrderSend(), si se ejecuta con éxito, devuelve el número de ticket de la orden que acaba de abrir - este es su número de serie en el servidor y no hay ninguna otra orden de este tipo. Por lo tanto, no es necesario ejecutar un retroceso de la orden, sólo recordar su entrada. Recuérdalo en cuanto se abra el pedido.

¿Y durante cuánto tiempo lo "recordaremos"? Podrías perderlo...

En mi opinión, deberíamos tomar siempre información fresca y actualizada cuando la necesitemos, y no almacenarla en la memoria, dependiendo de la ocasión.

Sería mejor encontrar el orden correcto antes de modificarlo en lugar de esperar el azar... Por si acaso no se corta la corriente, por ejemplo...

 
AlexLaptist:


Y, sin embargo, intentaré plantear la cuestión con más precisión... Mi Asesor Experto abre con éxito UNA orden pendiente y después de algún tiempo tiene que modificarla... Para ello, necesitamos conocer su índice o un número de posición en las órdenes pendientes. ¿Cómo puedo obtener este número de posición o su índice? ¿Hay que buscar los pedidos mediante un bucle for? Tengo una orden... Aquí está una parte del código de mi programa que no funciona


if (OrderSelect (1, SELECT_BY_POS, MODE_TRADES)==true)

{ticket = OrderTicket();

return();}

¿Cómo lo escribo correctamente?

Tal vez sea algo así:

//+----------------------------------------------------------------------------+
int TicketLastSetOrder(string sy, int mn) { // 
   datetime t;
   int      i, op, ticket=-1;
   for (i=0; i<OrdersTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS)) {
         op=OrderType();
         if (OrderMagicNumber()!=mn)   continue;
         if (OrderSymbol()!=sy)        continue;
         if (op<2 || op>5)             continue;
         if (OrderOpenTime()>t)  {
            t=OrderOpenTime();
            ticket=OrderTicket();
            }
         }
      else Print("FUNC TicketLastSetOrder(): Error select order: "+GetLastError());
      }
   return(ticket);
}
//+----------------------------------------------------------------------------+

Devuelve el billete de la última orden establecida o -1

Cuando llame, especifique el símbolo requerido y el magik del EA, por ejemplo:

   int TicketMyOrder=TicketLastSetOrder(Symbol(), Magic);

Esta función devolverá el ticket de la última orden pendiente colocada en el símbolo actual (el único en su caso). Magia - el número mágico de su EA

 

También podrías poner el ticket en variables globales. :) Se puede rodar en absoluto. Pero como idea la selección del orden antes de la modificación funcionará. Sólo si no es necesario reajustar los lotes sólo 1 vez para todo el tiempo de vida de una orden (con una sola modificación en eso) :) :).

En definitiva, hay muchas variantes :)

 

Por favor, dame una pista. Todavía no he descubierto cómo funcionan los indicadores. Mi indicador no dibuja cuando cambio de marco temporal, y dibuja de vez en cuando. Pero a veces lo hace, y funciona exactamente como yo quería. Por favor, dígame qué necesita.

//+------------------------------------------------------------------+
//|                                            ИндюкДимонакомпил.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#import "user32.dll"
   int   PostMessageA(int  hWnd,int  Msg,int  wParam,string lParam);
#import
#define WM_COMMAND                     0x0111
int delimiter = 0;

#property indicator_chart_window

#property indicator_buffers 3
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_color3 DarkBlue
double ВерхняячертаBuffer1[];
double НижняячертаBuffer2[];
double СинняячертаBuffer3[];
 double вершина; 
 double основание_первого_снижения;
 double начало;
 double вершина_волны_3;
 extern int T=4,K=200;
 int timeframe, start ;
 int бар_вершина ;
 int бар_основание_первого_снижения;
 int бар_начало;
int pereklutsatel;
double naklon,linija2; int P;extern int RO=-1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators

SetIndexStyle(0,DRAW_SECTION,STYLE_SOLID,2,CLR_NONE);//Alert ("SetIndexStyle ",GetLastError( ) );
  SetIndexBuffer(0,ВерхняячертаBuffer1);//Alert ("SetIndexBuffer ",GetLastError( ) );
   SetIndexEmptyValue(0,0.0);
   
   SetIndexStyle(1,DRAW_SECTION,STYLE_SOLID,2,CLR_NONE);//Alert ("SetIndexStyle ",GetLastError( ) );
  SetIndexBuffer(1,НижняячертаBuffer2);//Alert ("SetIndexBuffer ",GetLastError( ) ); 
   SetIndexEmptyValue(1,0.0);
   
   SetIndexStyle(2,DRAW_SECTION,STYLE_SOLID,T,CLR_NONE);//Alert ("SetIndexStyle ",GetLastError( ) );
  SetIndexBuffer(2,СинняячертаBuffer3);//Alert ("SetIndexBuffer ",GetLastError( ) ); 
   SetIndexEmptyValue(2,0.0);
   
   
  ObjectDelete("вершина");
  ObjectDelete("основание_первого_снижения  ");
   ObjectDelete("начало");
    ObjectDelete("точка4");
    ObjectDelete("пятая_точка!");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   ObjectDelete("вершина");
  ObjectDelete("основание_первого_снижения  ");
   ObjectDelete("начало");
    ObjectDelete("точка4");
    ObjectDelete("пятая_точка!");
   ObjectsDeleteAll(WindowOnDropped( ) , OBJ_TEXT);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int limit=Bars-counted_bars-1;

   for (int i=limit;i>=0;i--) {
//----
 for ( int J=0;J<=RO;J++){
//----

  // for(int i=Bars; i>=0;i--)
   i=Bars;
      бар_вершина=iHighest( NULL,  timeframe, MODE_HIGH, K, start ) ;
       вершина =High[ бар_вершина ];
       бар_основание_первого_снижения=iLowest( NULL,  timeframe, MODE_LOW,NormalizeDouble ( бар_вершина/2,0), start ) ;
       основание_первого_снижения=Low[ бар_основание_первого_снижения ];
       бар_начало=iLowest( NULL,  timeframe, MODE_LOW,NormalizeDouble (бар_вершина*1.5,0), бар_вершина ) ;
       начало=Low[ бар_начало ];
       
   ObjectCreate( "вершина",  OBJ_TEXT , WindowOnDropped( ) , Time[бар_вершина],  вершина+(10*Point)) ; 
    ObjectSetText( "вершина", "вершина", 5, "вершина",Crimson ) ;// Alert("GetLastError()",GetLastError());
      // ObjectSet(  "вершина",  OBJPROP_COLOR, Crimson) ;
      
   ObjectCreate( "основание_первого_снижения",  OBJ_TEXT , WindowOnDropped( ) , Time[бар_основание_первого_снижения],  основание_первого_снижения-(10*Point)) ; 
    ObjectSetText( "основание_первого_снижения", "основание_первого_снижения", 5, "основание_первого_снижения",Crimson ) ;   
   
    ObjectCreate( "начало",  OBJ_TEXT , WindowOnDropped( ) , Time[бар_начало],  начало-(10*Point)) ; 
    ObjectSetText( "начало", "начало", 5, "начало",Crimson ) ;   
           
  if(начало>основание_первого_снижения){naklon=(начало-основание_первого_снижения)/(бар_начало-бар_основание_первого_снижения);
 // Alert("naklon  ", naklon);
    НижняячертаBuffer2[бар_начало]=начало;linija2=начало;for(i=бар_начало-1;i>=0;i--){linija2=linija2-naklon;
   
    НижняячертаBuffer2[i]=linija2;  // Alert ("linija2  " , linija2 ); 
     Alert("НижняячертаBuffer2[i]  ", НижняячертаBuffer2[i] , "  i " , i);
     
   }
    НижняячертаBuffer2[бар_основание_первого_снижения]=основание_первого_снижения;}
    
    
         for (i=0;i<100;i++){  СинняячертаBuffer3[i]= Open[i];}
          for (i=330;i<500;i++){  СинняячертаBuffer3[i]= Open[i];}

     ВерхняячертаBuffer1[бар_начало]=начало;
     
 double точка4; int бар_точка4;   бар_точка4=iHighest( NULL,  timeframe, MODE_HIGH, бар_основание_первого_снижения, 3 ) ; 
  точка4 =High[ бар_точка4 ];  
   
   if(вершина>точка4){naklon=(начало-точка4)/(бар_начало-бар_точка4);
   ObjectCreate( "точка4",  OBJ_TEXT , WindowOnDropped( ) , Time[бар_точка4],  точка4+(10*Point)) ; 
    ObjectSetText( "точка4", "точка4", 5, "точка4",Crimson ) ;  
   double linija1=начало;for(i=бар_начало-1;i>=0;i--){linija1=linija1-naklon;ВерхняячертаBuffer1[i]=linija1; }}
   
double vulf=НижняячертаBuffer2[0];
  if ( vulf==Ask||vulf==Bid){vulf=1;}
 if (vulf+(10*Point)>Ask&&vulf-(10*Point)<Bid){vulf=1 ;} 
           
      Alert ("vulf  " , vulf );   Comment ("  vulf!!! "  , vulf);  
   if (vulf==1){Comment ("  Есть вульв!!! "  , "  timeframe " , timeframe);
   ObjectCreate( "пятая_точка!",  OBJ_TEXT , WindowOnDropped( ) , Time[0],  Bid-(10*Point)) ; 
    ObjectSetText( "пятая_точка!", "пятая_точка!", 5, "пятая_точка!",Crimson ) ;   return(0);  }
    if (vulf!=1) {    
   
     if(delimiter<3){delimiter++;Comment(delimiter);return(0);}
   delimiter=0;
    fChangePeriod();P++;
                                 
                   }  } }
//----
   return(0);
  }
//+------------------------------------------------------------------+

void fChangePeriod(){int ii,hwd = WindowHandle(Symbol(),Period());
   switch(Period()){
      case PERIOD_W1    : ii = 33134; break; //PERIOD_D1;
      case PERIOD_D1    : ii = 33136; break; //PERIOD_H4;
      case PERIOD_H4    : ii = 33135; break; //PERIOD_H1;
      case PERIOD_H1    : ii = 33140; break; //PERIOD_M30;
      case PERIOD_M30   : ii = 33139; break; //PERIOD_M15;
      case PERIOD_M15   : ii = 33138; break; //PERIOD_M5;
      case PERIOD_M5    : ii = 33137; break; //PERIOD_M1;
      case PERIOD_M1    : ii = 33141; break; //PERIOD_W1;
   }     
   PostMessageA(hwd, WM_COMMAND, ii, 0);
   return;
}
 
drknn:

También podrías poner el ticket en variables globales. :) Se puede rodar en absoluto. Pero como idea la selección del orden antes de la modificación funcionará. Sólo si no es necesario reajustar los lotes una sola vez durante toda la vida de la orden (con una sola modificación en eso) :) :).

En definitiva, hay muchas variantes :).

También puedes hacerlo de forma global. Pero el terminal los escribe en un archivo antes de cerrar (si la memoria no me falla). Es decir, no salvará de la pérdida de un billete ante un corte de luz inesperado.

Hasta ahora no veo una forma más fiable que tomar los datos directamente del servidor cuando los necesitas.