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

 
Craft:

Buenas tardes, continuando con la codificación, tomé el ejemplo de EA del artículo de la sección de tutoriales, sustituí el código del ejemplo:

A una arbitraria con fines de formación:

Las operaciones no aparecen, por favor, aconseja cuál es la razón, cómo arreglar el código.


double MA_1[]; // нет обьявления размера, не видно как (локально или глобально) обьявлен, 
// не видно оператора двигающего индекс массива.
// лучше пока не освоили работу с массивами обьявите переменные и не парьтесь

  double MA_0=iMA(NULL,0,Period_MA,0,MODE_EMA,PRICE_CLOSE,0);
  double MA_1=iMA(NULL,0,Period_MA,0,MODE_EMA,PRICE_CLOSE,1);
  
  if (MA_1 < MA_0)
     {                                          // ..МА последнего бара выше предыдущего
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
   if (MA_1 > MA_0)
     {                                          // ..МА последнего бара ниже предыдущего
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }
 

Urain, gracias, no dejo de asombrarme de la lógica de mql, y si intentas usar for(int i=1; para probar, el script no se simplifica - ¿podrías decirme cómo formatearlo, aún no puedo sentir la lógica del lenguaje, cómo definir el operador que mueve el array?

P. S. Declaré la matriz, por error en el script de ejemplo ha eliminado:

   double MA_1[];
   ArrayResize(MA_1,Period_MA);

   MA_1[0]=iMA(NULL,0,Period_MA,0,MODE_EMA,PRICE_CLOSE,0);

   if (MA_1[1] < MA_1[0])
     {                                          // 
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
   if (MA_1[1] > MA_1[0])
     {                                          // 
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }
 
Abzasc:
Diferencias en los precios. En consecuencia, los resultados de los indicadores son diferentes, al contrario...
No veo nada diferente ahí. Olvídate de los indicadores, una vez más, el adecuado para ti es el que estás operando. No te estás concentrando en el derecho en absoluto.
 
#property indicador_separar_ventana
#property indicator_buffers 2
#property indicator_color1 blue
#property indicator_color2 Rojo

extern int n = 20;
extern int t3_period = 5;
extern double b = 0,618;
extern int mBars = 300;
extern int Bares.Count = 0;
int i,t,c;
double Buf1[],Buf2[],CF_p[5001],CF_n[5001],Ch_p[5001],Ch_n[5001],k_n,k_p,ch_p,ch_n,cff_p,cff_n,
AcBars,t3,t32,A1,A2,b2,b3,c1,c2,c3,c4,e1,e2,e3,e4,e5,e6,n1,w1,w2,e12,e22,e32,e42,e52,e62;


//+------------------------------------------------------------------+
int init() {
SetIndexStyle(0, DRAW_LINE);
SetIndexBuffer(0, Buf1);
SetIndexStyle(1, DRAW_LINE);
SetIndexBuffer(1, Buf2);
return(0); }
//+------------------------------------------------------------------+
int inicio() {
int límite;
if (IndicatorCounted()<0) return(-1);
limit=Bars-IndicatorCounted();
if (Bars.Count>0 && limit>Bars.Count) limit=Bars.Count;
for(int i=0; i<limit; i++)
{

b2=b*b; b3=b2*b; c1=-b3; c2=(3*(b2+b3)); c3=-3*(2*b2+b3); c4=(1+3*b+b3+3*b2); n1=t3_period;

if(n1<1) n1=1; n1=1+0,5*(n1-1); w1=2/(n1+1); w2=1-w1;

if(AcBars==0) AcBars=Bars-mBars;

for(c=AcBars; c<=Bars-1; c +++) { i=Bars-1-c; {

if(Close[i]>Close[i+1]) { Ch_p[i]=Close[i]-Close[i+1]; CF_p[i]=Ch_p[i]+CF_p[i+1]; Ch_n[i]=0; CF_n[i]=0; }
Si no, { Ch_p[i]=0; CF_p[i]=0; Ch_n[i]=Cerrada[i+1]-Cerrada[i]; CF_n[i]=Ch_n[i]+CF_n[i+1]; }}

for(t=i+n; t>=i; t--) { ch_p=Ch_p[t]+ch_p; ch_n=Ch_n[t]+ch_n ; cff_p=CF_p[t]+cff_p; cff_n=CF_n[t]+cff_n; }

k_p=ch_p-cff_n; k_n=ch_n-cff_p;

A1=k_p; e1=w1*A1+w2*e1; e2=w1*e1+w2*e2; e3=w1*e2+w2*e3; e4=w1*e3+w2*e4;
e5=w1*e4+w2*e5; e6=w1*e5+w2*e6; t3=c1*e6+c2*e5+c3*e4+c4*e3; Buf1[i]=t3;

A2=k_n; e12=w1*A2+w2*e12; e22=w1*e12+w2*e22; e32=w1*e22+w2*e32; e42=w1*e32+w2*e42;
e52=w1*e42+w2*e52; e62=w1*e52+w2*e62; t32=c1*e62+c2*e52+c3*e42+c4*e32; Buf2[i]=t32;

AcBars=AcBars+1; ch_p=0; ch_n=0; cff_p=0; cff_n=0; }
}

return(0); }


Me puedes decir donde no se actualiza el error, el historial es normal y el online no

Archivos adjuntos:
 

Buenas tardes. Se ha declarado un array, se ha establecido el operador que mueve el índice del array, pero los pedidos no se realizan. Por favor, dígame qué es lo que está mal.

   double MA_1[];
   ArrayResize(MA_1,Period_MA);

   for(int j=0;j<=Period_MA-1;j++)
   MA_1[j]=iMA(NULL,0,Period_MA,0,MODE_EMA,PRICE_CLOSE,j);

   
   if (MA_1[j+1] < MA_1[j])
     {                                          // 
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
   if (MA_1[j+1] > MA_1[j])
     {                                          // 
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }
 

Prueba conOrderSend, entonces funciona...

¿Has leído el ayudante estándar de MetaEditore? Si no es así, lee todo el...

Craft:

Buenas tardes. He declarado un array y definido el operador que mueve el índice del array, pero las órdenes no se colocan. Por favor, indíqueme qué es lo que está mal.

 
¿Pueden decirme si es posible reescribir la función de Igor Kim, que cierra todas las órdenes perdedoras, cuya pérdida supera un determinado valor:
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 25.04.2008                                                     |
//|  Описание : Закрытие тех позиций, у которых убыток в валюте депозита       |
//|             превысил некоторое значение                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    pr - профит/убыток                                                      |
//+----------------------------------------------------------------------------+
void ClosePosBySizeLossInCurrency(string sy="", int op=-1, int mn=-1, double pr=0) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderSwap()<-MathAbs(pr)) ClosePosBySelect();
          }
        }
      }
    }
  }
}
Necesito encontrar una posición abierta que tenga la mayor pérdida.
La cuestión es que tengo que encontrar la posición con más beneficios que la perdedora y cerrarlas en contracorriente.
¿Quizás alguien tenga alguna experiencia con esto, o se haya enfrentado a un problema así?
 
¿Por qué tres indicadores basados en principios diferentes no pueden mostrar casi la misma imagen (spearman, estocástico y mcdrsy), pero no pueden mostrar el movimiento correcto y la entrada con una probabilidad superior al 60%?
 
Hola, me pregunto qué código se necesita para cerrar una orden después de que haya pasado el punto X de beneficio y haya empezado a bajar hasta el punto Y>PrecioDeAperturaDeLaOrden y entonces necesite cerrarla.
 
StatBars:

Prueba con OrderSend, entonces funciona...

¿Has leído el ayudante estándar de MetaEditore? Si no, léelo todo...


De edad infantil para hacer una pregunta sin haber dirigido a ayudar y yandex han crecido. Hay muchos envíos, pero los puestos no se abren:

double MA_1[];
   ArrayResize(MA_1,Period_MA);

   for(int j=0;j<=Period_MA-1;j++)
   MA_1[j]=iMA(NULL,0,Period_MA,0,MODE_EMA,PRICE_CLOSE,j);

   
   if (MA_1[j+1] < MA_1[j])
     {                                          // 
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
   if (MA_1[j+1] > MA_1[j])
     {                                          // 
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }
   // Открытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      if (Total==0 && Opn_B==true)              // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         SL=Bid - New_Stop(StopLoss);     // Вычисление SL откр.
         TP=Bid + New_Stop(TakeProfit);   // Вычисление TP откр.
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP);//Открытие Buy
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Buy ",Ticket);
            return;                             // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
      if (Total==0 && Opn_S==true)              // Открытых орд. нет +
        {                                       // критерий откр. Sell
         RefreshRates();                        // Обновление данных
         SL=Ask + New_Stop(StopLoss);     // Вычисление SL откр.
         TP=Ask - New_Stop(TakeProfit);   // Вычисление TP откр.
         Alert("Попытка открыть Sell. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,SL,TP);//Открытие Sel
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Sell ",Ticket);
            return;                             // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
      break;                                    // Выход из while
     }