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

 
alsu:
Has acertado. Además, cuando sacamos un valor de la caja, es de tipo double, pero si se da la orden de escribir el resultado en una variable de tipo int, el compilador tomará automáticamente todos los pasos necesarios para poner el valor en una nueva caja.


Para asegurarme finalmente de que lo he entendido bien, por favor, compruebe mis pensamientos sobre su último párrafo... Por lo tanto, tengamos el mencionado experto:

//--------------------------------------------------------------------
// globalvar.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int    Experts;                                 // Колич. экспертов
double Depo=10000.0,                            // Заданный депозит
       Persent=30,                              // Заданный процент     
       Money;                                   // Искомые средства
string Quantity="GV_Quantity";                  // Имя GV-переменной
//--------------------------------------------------------------------
int init()                                      // Спец. функция init
  {
   Experts=GlobalVariableGet(Quantity);         // Получим тек. знач.
   Experts=Experts+1;                           // Колич. экспертов
   GlobalVariableSet(Quantity, Experts);        // Новое значение
   Money=Depo*Persent/100/Experts;              // Средства для эксп.
   Alert("Для эксперта в окне ", Symbol()," выделено ",Money);
   return;                                      // Выход из init()
  }
//--------------------------------------------------------------------
int start()                                     // Спец. функция start
  {
   int New_Experts= GlobalVariableGet(Quantity);// Новое колич. эксп.
   if (Experts!=New_Experts)                    // Если изменилось
     {
      Experts=New_Experts;                      // Теперь текущ. такое
      Money=Depo*Persent/100/Experts;           // Новое знач. средств 
      Alert("Новое значение для эксперта ",Symbol(),": ",Money);
     }
   /*
   ...
   Здесь долен быть указан основной код эксперта,
   в котором используется значение переменной Money
   ...
   */
   return;                                      // Выход из start()
  }
//--------------------------------------------------------------------
int deinit()                                    // Спец. ф-ия deinit
  {
   if (Experts ==1)                             // Если эксперт один..
      GlobalVariableDel(Quantity);              //..удаляем GV-перемен
   else                                         // А иначе..
      GlobalVariableSet(Quantity, Experts-1);   //..уменьшаем на 1
   Alert("Эксперт выгружен из окна ",Symbol()); // Сообщ. о выгрузке
   return;                                      // Выход из deinit()
  }
//--------------------------------------------------------------------

Luego en la cadena:

Experts=GlobalVariableGet(Quantity);         // Получим тек. знач.

Ponemos una variable de tipo entero Expertos en la casilla "GV-variable" para su almacenamiento (convirtiéndola a tipo doble). Entonces si (suposición hipotética) habría una cadena en el Asesor Experto

int New_Experts=Experts;

significaría que hay un comando para escribir el resultado en una variable de tipo int. En este caso el compilador:

* tomaría el valor de la variable de tipo double fuera de la caja,

* realizar los cambios necesarios en el valor de la variable Experts,

* asignar este valor a la variable Nuevos_Expertos y...

* poner el valor de la variable Nuevos_Expertos en una casilla "int".

Así que el tipo de variable no es más que un envoltorio/paquete externo de algún valor... y por tanto las variables GV no pueden ser de tipo cadena, ya que la degradación sólo se permite para valores numéricos, y las cadenas no se convierten en números.

¿Verdad?

Gracias de antemano por su respuesta.

 
Stells:
lo que no es así for (f=1;f<Bars;f++)
{
Precio1 = (iClose(Symbol_1,0,0) - iClose(Symbol_1,0,f)) / MarketInfo(Symbol_1, MODE_POINT)
Precio2 = K*(iClose(Symbol_2,0,0) - iClose(Symbol_2,0,f)) / MarketInfo(Symbol_2, MODE_POINT);
Spread = Precio1 - Precio2;
Print ("Price1="+Price1, " Price2="+Price2);
if (Spread==0){t=f; break;}
}
Precio12 = (iClose(Symbol_1,0,0) - iClose(Symbol_1,0,t)) / MarketInfo(Symbol_1, MODE_POINT);
Precio22 = K*(iClose(Symbol_2,0,0) - iClose(Symbol_2,0,t)) / MarketInfo(Symbol_2, MODE_POINT);
Spread2 = Precio12 - Precio22;


if (MathAbs(Spread2) >= razdvizka && Spread2 < 0) { abre la operación }


quiere fijar la barra en la que el spread era igual a cero y controlar el spread a partir de ella

if(MathAbs(Spread)<eps) { ........ } y todavía hay que controlar el resultado: si se encuentra el punto que satisface la condición o no. En mi opinión, es mejor crear una función separada, por ejemplo, así:

int GetBarNumWithZerroDist(string Smbl1, string Smbl2, double K, double eps=0.00001)
{
int i=1;
double Smb1Cl0 = NrmalizeDouble(iClose(Smbl1,0,0));
double Smb2Cl0 = NrmalizeDouble(iClose(Smbl2,0,0));
double Smb1Pnt = MarketInfo(Smbl1, MODE_POINT);
double Smb2Pnt = MarketInfo(Smbl2, MODE_POINT);
int    mBars   = MathMin(iBars(Smbl1), iBars(Smbl2));

    for (i=1;i<mBars;i++) 
    {
        double Price1 =   (Smb1Cl0 - iClose(Symbol_1,0,i)) / Smb1Pnt;
        double Price2 = K*(Smb1Cl0 - iClose(Symbol_2,0,i)) / Smb2Pnt;
        double Spread = Price1 - Price2; 
        //Print ("Price1="+Price1, " Price2="+Price2);
        if(MathAbs(Spread)< eps) return(i);
    }
    return(-1);
}
 

Hola.

¿Sabes si existe una #propiedad en los indicadores que permita que el indicador muestre siempre el mismo periodo, por ejemplo, d1?

¿y no cambiará aunque cambie de marco temporal en MetaTrader?

gracias

------------------------------------------

oh... cuántos pros.....

 

¡¡¡¡ayuda!!!!

cómo llamar al indicador desde el script, realmente necesito que se muestre en una ventana

 

Buenas noches, por favor ayúdenme a hacer cambios en el código del EA:
1. En las pruebas todo va bien - pero en el comercio la primera operación tiene que ser abierta manualmente, stop y take también. Me gustaría que el EA comenzara a operar automáticamente cuando el precio llegue a un nuevo tick.
2. Como en el caso de un stop loss activado, la siguiente posición se abre con el doble del lote anterior, el lote puede aumentar teóricamente hasta el infinito (en mi caso, hasta 51,2), me gustaría limitarlo (por ejemplo, 0,8) con la posibilidad de cambiar el umbral. Cuando se alcanza el umbral y se activa un stop, el EA no se desconectaría, sino que volvería a empezar desde 0,1.

//--- input parameters
extern double    Lot=0.1;
extern int       TP=22;
extern int       SL=20;
extern double    K_Martin=2;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
 {
double oop, ocp, osl, otp, ol; 
int Magic = 0;
int closetime= 0,lastorder=0, tip=0;
for(int i=0;i<OrdersHistoryTotal();i++) /* Цикл перебора ордер*/
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue; // Выбираем ордер из истории.
if(OrderMagicNumber()!=Magic) continue;
if(closetime<OrderCloseTime())
{
closetime = OrderCloseTime();
lastorder = OrderTicket();
tip=OrderType();
ol=OrderLots();
}
}
OrderSelect(lastorder,SELECT_BY_TICKET,MODE_HISTORY);
ocp= (OrderClosePrice());
oop= (OrderOpenPrice());
osl= (OrderStopLoss());
otp= (OrderTakeProfit());
ol= (OrderLots());
Print ("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена открытия ОРДЕРА--[",OrderOpenPrice(),"]"); 
Print ("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена закрытия ОРДЕРА--[",OrderClosePrice(),"]");
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==false )
{
if(tip == OP_SELL && osl==ocp) //Ордер SELL закрылся по по SL значит покупаем
{
OrderSend(Symbol(),OP_BUY,ol*K_Martin,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,Blue); /*Если выполняется условие то покупаем*/
}
if(tip == OP_SELL && otp==ocp) //Ордер SELL закрылся по по TP значит продаем
{
OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point, Bid-TP*Point,0,0,0,Red); /*Если выполняется условие то продаем*/ 
} 
if(tip == OP_BUY && osl==ocp) //Ордер BUY закрылся по SL значит продаем
{
OrderSend(Symbol(),OP_SELL,ol*K_Martin,Bid,0,Bid+SL*Point,Bid-TP*Point,0,0,0,Red); /*Если выполняется условие то продаем*/ 
}
if(tip == OP_BUY && otp==ocp) //Ордер BUY закрылся по по TP значит покупаем
{
OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,Blue); /*Если выполняется условие то покупаем*/
} 
}
return(0);
}

 
Top2n:

Ayuda, por favor. He estado luchando todo el día sin ninguna ayuda.

La orden está en la recogida (Main BAY, pendiente de sellsstop como seguridad).

En el cierre sellsstop en la no-perdida, pospuesto de nuevo en el mismo lugar.

Gira esta cosa,https://www.mql5.com/ru/code/8846.
 
7777877:


Para asegurarme finalmente de que lo he entendido bien, por favor, compruebe mis pensamientos sobre su último párrafo... Por lo tanto, tengamos el mencionado experto:

Luego en la cadena:

Ponemos una variable de tipo entero Expertos en la casilla "GV-variable" para su almacenamiento (convirtiéndola a tipo doble). Entonces si (suposición hipotética) habría una cadena en el Asesor Experto

significaría que hay un comando para escribir el resultado en una variable de tipo int. En este caso el compilador:

* tomaría el valor de la variable de tipo double fuera de la caja,

* realizar los cambios necesarios en el valor de la variable Experts,

* asignar este valor a la variable Nuevos_Expertos y...

* poner el valor de la variable Nuevos_Expertos en una casilla "int".

Así que el tipo de variable no es más que un envoltorio/paquete externo de algún valor... y por tanto las variables GV no pueden ser de tipo cadena, ya que la degradación sólo se permite para valores numéricos, y las cadenas no se convierten en números.

¿Verdad?

Gracias de antemano por la respuesta.

No exactamente. La cuestión es que la variable Experts ya tiene el tipo int, por lo que la conversión de tipo debe realizarse ANTES de asignarle un valor, es decir, el compilador

* sacó de la caja un valor de tipo double (no tiene nombre en su programa, y se escribe simplemente en alguna dirección conocida por el compilador en la memoria principal o en el registro de la CPU)

* realizó todos los cambios necesarios en el valor de la variable anterior y escribió un nuevo valor (¡de tipo int!) en la variable Experts,

* asignó este valor (de tipo int!) a la variable Nuevos_Expertos. Tienen el mismo tipo, por lo que sólo se trata de copiar un valor de una ubicación de memoria a otra.


P.D. Es estupendo ver que hay personas que comprenden sus actos con tanto detalle. De hecho, no es una broma. Manténgase en contacto.

 
Andrew1001:

Buenas noches, por favor ayúdenme a hacer cambios en el código del EA:
1. En las pruebas todo va bien - pero en el comercio la primera operación tiene que ser abierta manualmente, stop y take también. Me gustaría que el EA comenzara a operar automáticamente cuando el precio alcance un nuevo tick.
Como en el caso de un stop loss activado, la siguiente posición se abre con el doble del lote anterior, el lote puede aumentar teóricamente hasta el infinito (en mi caso, hasta 51,2), me gustaría limitarlo (por ejemplo, 0,8) con la posibilidad de cambiar el umbral. Cuando se alcanza el umbral y se activa un stop, el Asesor Experto no se desconectaría y volvería a empezar desde 0,1.


Pruébalo:

extern double Lot=0.1,K_Martin=2,porog=0.8;
extern int TP=22,SL=20,Magic=233;
extern bool poz1_up=true;//ваш выбор:1-ая покупка или продажа(false)? 
extern bool Trade=true;//торговля разрешить?
bool fix;int init(){fix=true;return(0);}int deinit(){return(0);}
int start(){double oop,ocp,osl,otp,ol,lotos;int closetime=0,lastorder=0,tip=0;if(!Trade)return(0);
if(poz1_up&&fix){OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);fix=0;}  
if(!poz1_up&&fix){OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);fix=0;}
for(int i=0;i<OrdersHistoryTotal();i++)
  {if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
   if(OrderMagicNumber()!=Magic)continue;
   if(closetime<OrderCloseTime())lastorder=OrderTicket();}
if(OrderSelect(lastorder,SELECT_BY_TICKET,MODE_HISTORY))
  {tip=OrderType();oop=OrderOpenPrice();osl=OrderStopLoss();
   otp=OrderTakeProfit();ol=OrderLots();ocp=OrderClosePrice();}
Print("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена открытия--[",OrderOpenPrice(),
        "]--","цена закрытия--[",OrderClosePrice(),"]--","прибыль--[",OrderProfit(),"]");
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==0)
  {if(tip==OP_SELL){if(osl==ocp){lotos=ol*K_Martin;if(lotos>porog)lotos=Lot; 
     OrderSend(Symbol(),OP_BUY,lotos,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);}
     if(otp==ocp)OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);} 
  if(tip==OP_BUY){if(osl==ocp){lotos=ol*K_Martin;if(lotos>porog)lotos=Lot;
     OrderSend(Symbol(),OP_SELL,lotos,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);} 
  if(otp==ocp)OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);}}return(0);}
//+------------------------------------------------------------------+
 
Hola. ¿Puedes decirme dónde puedo leer cómo hacer transacciones en el probador, por mí mismo? Se lo agradecería.
 

Hola a todos.

Tengo un script que cierra todas las órdenes disponibles.

No entiendo tres líneas en él:

Si no es difícil, por favor, tradúzcalo al ruso para un principiante.

He estudiado el tutorial, pero no me he encontrado con expresiones lógicas tan largas.

El script que adjunto. Gracias.

Archivos adjuntos: