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

 

Si lo sabes, hay dos líneas, una que sigue los nuevos máximos en una serie de velas, y la otra que sigue los mínimos. Cuando la distancia entre las líneas es superior a 50, se debe trazar una línea vertical. La línea vertical necesita una coordenada: el tiempo. ¿Cómo puedo dibujar el tiempo cuando la distancia entre las líneas será superior a 50? No se me ocurre nada.

Quería dibujar la línea vertical usando ObjectCreate... Si se puede hacer sin tiempo, ¿qué se debe utilizar?
 
waitra >> :

¿Podría haber una función que simplemente detecte que "aún no hay órdenes en el historial del EA"? - Eso sería suficiente.

No lo sé. ¿Quizás alguien de aquí pueda decírnoslo?

Creo que deberíamos intentar modificar la función de Kim. Este:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru            |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                  |
//|  Описание : Возвращает количество позиций.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                            |
//|    sy - наименование инструмента   (""   - любой символ,  |
//|                                     NULL - текущий символ)          |
//|    op - операция                   (-1   - любая позиция)       |
//|    mn - MagicNumber                (-1   - любой магик)               |
//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;
  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()== sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) {
            if ( mn<0 || OrderMagicNumber()== mn) kp++;
          }}}}}  return( kp);}

Es decir, en lugar de MODE_TRADES, tome MODE_HISTORY - es decir, la orden se selecciona entre las órdenes cerradas y borradas.

Entonces (cambiar el nombre de f-i) :

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru            |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                  |
//|  Описание : Возвращает кол-во ордеровиз истории счета  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                           |
//|    sy - наименование инструмента   (""   - любой символ, |
//|                                     NULL - текущий символ)        |
//|    op - операция                   (-1   - любая позиция)       |
//|    mn - MagicNumber                (-1   - любой магик)             |
//+----------------------------------------------------------------------------+
int NumberOfPos_HISTORY (string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;
  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY )) {
      if (OrderSymbol()== sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) {
            if ( mn<0 || OrderMagicNumber()== mn) kp++;
          }}}}}  return( kp);}

Pruébalo, ¿funcionará o no?

 

Buenas tardes, amigos.


Por favor, aconséjeme sobre esto.


Por ejemplo, necesito abrir una posición cuando una "vela de precio" ha cruzado una media móvil.

Hasta ahora, sólo sé cómo clasificar las señales cuando una vela cierra/abre por encima/por debajo de la media móvil...

( iMA( .....) >Cerrar[1] o iMA(....) >Abrir[0] )

¿Cómo puedo entrar cuando la vela actual ya está por encima/debajo de la MA, en lugar de esperar a que se cierre la actual y se abra la siguiente, si ya está por encima/debajo de la MA?


Muchas gracias de antemano.

 
Morzh09 >> :

Buenas tardes, amigos.


Por favor, aconséjeme sobre esto.


Por ejemplo, necesito abrir una posición cuando una "vela de precio" ha cruzado una media móvil.

Hasta ahora, sólo sé cómo clasificar las señales cuando una vela cierra/abre por encima/por debajo de la media móvil...

( iMA( .....) >Cerrar[1] o iMA(....) >Abrir[0] )

¿Cómo puedo entrar cuando la vela actual ya está por encima/debajo de la MA, en lugar de esperar a que se cierre la actual y se abra la siguiente, si ya está por encima/debajo de la MA?


No sé qué hacer con él.

¿Qué te parece?

iMA(....) >Abrir[0] ? - cero es la vela actual.

 
rid >> :

Qué es lo que no le gusta:

iMA(....) >Abrir[0] ? - cero es la vela actual

es cierto, pero, por ejemplo, hay casos en los que, después de abrir por debajo de la MA, el precio luego (normalmente en las noticias) rompe la MA en una vela larga y sube, abajo....

Si utilizamos mi criterio de apertura, podemos pasar por alto tales movimientos...

Por lo tanto, me gustaría abrir una posición si el precio está actualmente por encima/debajo de la media, en lugar de esperar a que ésta se cierre y se abra la siguiente vela.

 

Esto podría ser :

if (  iMA(.... .... , 1) >Close[1]  && iMA(.... ... , 0) < Open[0]  ) // продажа

(Si la MA de la barra anterior es mayor que el precio de cierre de la barra anterior y la MA de la barra actual es menor que el precio de apertura de la barra actual, entonces vende)

 

Llevo dos días trasteando y no lo consigo. Tomé el código del tutorial de Kovalev e intenté abrir una orden de compra y obtuve la respuesta "Error 130".

Código

nt f_Open_Ord(int Tip)
{
int Ticket, // Número de orden
MN; // MagicNumber

double SL, // StopLoss (valor del precio relativo)
TP; // TakeProf (valor del precio relativo)
//--------------------------------------------------------------- 3 --
while(g_Mas_Tip[Tip]==0) // Mientras .
{ //...sin éxito
if (SL<g_Level_new) // si es menor de lo permitido...
SL=(g_Nivel_nuevo+20); // ... entonces permitido
if (TP<g_Nivel_nuevo)
// Si es menor que el permitido...
TP=(g_Nivel_nuevo+20); // .entonces permitido
MN=TimeCurrent(); // Simple MagicNumber
f_Inform(13,Tip); // Mensaje al intentar abrir
if (Tip==0) // Vamos a abrir Buy
{
SL=Bid - SL*Point; // StopLoss (precio)
SL=NormalizeDouble(SL,Digits);
TP=Bid + TP*Point; // TakeProfit (precio)
TP=NormalizeDouble(TP,Digits);
Ticket=OrderSend(Symbol(),0,g_Lots_New,Ask,5,1.46500,1.47500,",MN);
err=GetLastError();
Comment("número de error ",err);
if (Ticket>0) f_Inform(4);
//if (Ticket<0) f_Inform(25)

Código reelaborado.Todo funciona correctamente.Creo que el error no está en el código. DC-Broco/.

 

Sorri, eso fue precipitado. Los valores 1.46500 y 1.47500 en la función OrderSend deben cambiarse por SL y TP respectivamente

 
VNG писал(а) >>

Sorri, eso fue precipitado. Los valores 1.46500 y 1.47500 en la función OrderSend deben ser sustituidos por SL y TP, respectivamente

¿A qué equivalen el SL y el TP? Si es cero, como en el código anterior, todo es correcto. Debería generarse un error

 

Los topes se toman de la variable global g_Level_new, que se calcula como g_Level_new=MarketInfo(Symbol(),MODE_STOPLEVEL )