[¡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 205

 

Buenas tardes. La pregunta es la siguiente. En ellibro MQL4 deS.K ., enla sección "Operaciones de trading", hay un ejemplo de un sencillo script que modifica una orden pendiente cuyo precio declarado es superior al de otras órdenes pendientes (modifyorderprice.mq4) de la siguiente manera:

//--------------------------------------------------------------------
// modifyorderprice.mq4 
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
int start()                                     // Спец.функция start
  {
   int Tral=10;                                 // Дист. приближения
   string Symb=Symbol();                        // Финанс. инструмент
   double Dist=1000000.0;                       // Предустановка
   double Win_Price=WindowPriceOnDropped();     // Здесь брошен скрипт
//--------------------------------------------------------------- 2 --
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         //------------------------------------------------------ 3 --
         if (OrderSymbol()!= Symb) continue;    // Не наш фин.инструм.
         if (OrderType()<2) continue;           // Рыночный ордер  
         //------------------------------------------------------ 4 --
         if(NormalizeDouble(MathAbs(OrderOpenPrice()-Win_Price),Digits)
            < NormalizeDouble(Dist,Digits))     // Выбираем ближайший
           {
            Dist=MathAbs(OrderOpenPrice()-Win_Price);// Новое значение
            int    Tip   =OrderType();          // Тип выбранного орд.
            int    Ticket=OrderTicket();        // Номер выбранн. орд.
            double Price =OrderOpenPrice();     // Цена выбранн. орд.
            double SL    =OrderStopLoss();      // SL выбранного орд.
            double TP    =OrderTakeProfit();    // TP выбранного орд.
           }                                    // Конец if
        }                                       // Конец анализа ордера
     }                                          // Конец перебора орд.
//--------------------------------------------------------------- 5 --
   if (Tip==0)                                  // Если отложенных нет
     {
      Alert("По ",Symb," отложенных ордеров нет");
      return;                                   // Выход из программы
     }
//--------------------------------------------------------------- 6 --
   while(true)                                  // Цикл закрытия орд.
     {
O hay un error en este script en el bloque 5-6, porque (según veo) la línea
if (Tip==0)                                  // Если отложенных нет
Debe ser de la forma
if (Tip<2)                                  // Если отложенных нет
ya que todos los tipos de órdenes no pendientes (de mercado) tienen el tipo 0 o 1, es decir, menos de 2.

O he entendido algo mal.

Pregunta: ¿Podría aclarar: si he entendido algo mal, qué es?

Gracias de antemano por su respuesta.

 
7777877:

Buenas tardes. Tengo la siguiente pregunta. En ellibro MQL4de S.K ., enla sección "Trading Operations", hay un ejemplo de un simple script que modifica una orden pendiente cuyo precio declarado está más cerca del punto donde se adjunta el script que los precios de otras órdenes pendientes(

O hay un error en este script en el bloque 5-6, porque (según veo) la línea

debería ser

así porque todos los tipos de órdenes no pendientes (de mercado) tienen tipo 0 o 1, es decir, menos de 2.

O he entendido algo mal.

Pregunta: ¿podría aclararme: si he entendido algo mal, qué

exactamente?

Gracias de antemano por la

respuesta

querida... no escribas en letras tan grandes aquí... podrías romperte los ojos :-)

y que... antes de hacer preguntas... ¿has probado a leer el BACKGROUND en el MetaEditor? ¿Todo?... para empezar... para que no hagas preguntas estúpidas sobre tipos y cosas así....

===

Tipo de operación para la función OrderSend(). Puede ser cualquiera de los siguientes valores:

Constante Valor Descripción
OP_BUY 0 Comprar
OP_VENDER 1 Vender
OP_BUYLIMIT 2 Orden pendiente de Límite de Compra
OP_SELLLIMIT 3 Orden pendiente de VENTA LIMITADA
OP_BUYSTOP 4 Orden pendiente de COMPRA STOP
OP_SELLSTOP 5 Orden pendiente de venta de STOP
 

pero en cuanto al tipo - no hay nada malo... exactamente ==0 debería ser...

porque en el tercer bloque

      if (OrderType()<2) continue;           // Рыночный ордер  

las órdenes de mercado se saltan...

===

y si las órdenes pendientes se encuentran en la lista de órdenes, la variable TYPE no será igual a 0

---

 

Buenas tardes. ¿Puedes darme una pista?

Por ejemplo, tenemos un criterio para el paso de MA por el Nivel_R y el Nivel_S:

int Criterion;
double MA_1=iMA(......,0);
double MA_2=iMA(......,1);
double MA_3=iMA(......,2);
if(MA_1 > Level_S_1 && Ma_2 <= Level_S_2 MA_3 <= Level_S_3) Criterion=1;
if(MA_1 > Level_R_1 && Ma_2 <= Level_R_2 MA_3 <= Level_R_3) Criterion=2;

Pregunta: ¿cómo memorizamos el Criterio para que mantenga un valor de 1 o 2 (según el pase) hasta que se produzca un nuevo pase y no se reinicie en los siguientes ticks .

 
Poner la definición de la variable fuera de la función de Inicio u otra... En las variables globales...
 
Aleksander:
Poner la definición de la variable fuera de la función de Inicio u otra... En las variables globales...
Lo he intentado, y ha estado jurando... insinuando mi incompetencia.
 
entonces, si el texto es pequeño, publique todo el texto... 20-30 líneas como máximo
 
int Criterion, Crit;
int start()
 {
  Crit= Fun_Criterion( Criterion); 

  switch(Crit)
   {
   /************/
   }
return(0);
 }

Fun_Criterion(int Criterion)
 {
  if(MA_1 > Level_S_1 && Ma_2 <= Level_S_2 MA_3 <= Level_S_3) Criterion=1;
  if(MA_1 < Level_R_1 && Ma_2 >= Level_R_2 MA_3 >= Level_R_3) Criterion=2;

  return(Criterion);
 }
 

¿por qué hay intermediarios? y ¿cuál es la función de la FUN?

int Criterion;
int start() {
  Fun_Criterion(); 

  switch( Criterion)
   {
   /************/
   }
  return(0);
}
//-----------------------------
void Fun_Criterion() {
  if(MA_1 > Level_S_1 && Ma_2 <= Level_S_2 &&  MA_3 <= Level_S_3) Criterion=1;
  if(MA_1 < Level_R_1 && Ma_2 >= Level_R_2 &&  MA_3 >= Level_R_3) Criterion=2;
 }

Y && no están en el lugar correcto...

 
A mi modo de ver, era el PARÁMETRO TRANSFERIBLE))))), pero no podía prescindir de él)). Gracias, lo he arreglado y ya funciona.