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

 

Roll, gracias por el consejo, aquí hay una función para mostrar un comentario en la esquina inferior izquierda del gráfico si alguien lo necesita:

void mycomment(color c,string mytext)
{
string name="mycomment";
if(ObjectFind(name)<0) ObjectCreate(name,OBJ_LABEL,0,0,0);
ObjectSet("mycomment", OBJPROP_CORNER, 2);
ObjectSet(name,OBJPROP_XDISTANCE,5);
ObjectSet(name,OBJPROP_YDISTANCE,7);
ObjectSetText(name,mytext,12,"",c);
}

 
Me pueden decir cómo reabrir un archivo en un script: abrir archivo - mirar a través - cerrar archivo, cuando intento reabrirlo me dice "fin de archivo"...
 
Hola, Pueden aconsejar si alguien se ha encontrado con este problema: En la ventana del gráfico de divisas, a veces el propio gráfico desaparece. Luego dice refrescar y todo se restablece. En este momento, a veces los asesores expertos empiezan a trabajar de forma incorrecta (abriendo operaciones sin condiciones). Hoy incluso he abierto una operación con el lote máximo. Me he dado cuenta y he cerrado con 2,5 puntos de pérdida. Aquí está el código para determinar el lote. Sospecho que esto se debe a las dos últimas líneas. ¿Pero cómo?
//========================================================================                                                                              
//определение лота
//========================================================================

double Free =AccountFreeMargin();
double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
double Step =MarketInfo(Symbol(),MODE_LOTSTEP);
double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
LOT=NormalizeDouble(AccountFreeMargin()*RISK/100000,2);
if (LOT*One_Lot > Free) // Не хватает даже..
     {                                         // ..на минимальн. лот:(
         Comment("денег нет  " );  
            return(0);                           // ..и выход 
     }
     else Comment("деньга есть  " );
if(LOT<Min_Lot)
 LOT=Min_Lot;
if(LOT>Max_Lot)
 LOT=Max_Lot;
далее открытие ордера по условиям.
 
Lians:

Hola a todos.

Me pueden decir si es posible mostrar texto en un gráfico, como

como una función separada para que pueda ser llamada así:

Mira esta función:

//+----------------------------------------------------------------------------+
void iPrint(bool print, string mess1, string mess2="", string mess3="", string mess4="", 
            int sz=9, color cl1=Aqua, color cl2=Aqua, color cl3=Aqua, color cl4=Aqua) {
   string   NameGrafText, message, nm;
   int      i, y, k, LenStr, shift, Win_Num=-1, num=0;
   color    cl;
   if (mess1=="") {
      Print("Func iPrint: Передана пустая строка, выходим");
      return;
      }
   Win_Num=WindowFind("Win_Inform");
   if (print || Win_Num<0) {
      message=mess1+mess2+mess3+mess4;
      Print(message); 
      return;
      }
   k=ArraySize(Mass_Name_Message)-1;
   if (StringLen(mess1)>0) num++;
   if (StringLen(mess2)>0) num++;
   if (StringLen(mess3)>0) num++;
   if (StringLen(mess4)>0) num++;
   for (i=k; i>=0; i--) {                             
      NameGrafText=Mass_Name_Message[i];           
      if (StringLen(NameGrafText)>0)
      if (ObjectFind(NameGrafText)==Win_Num) {
         if (i+num>k) {
            ObjectDelete(NameGrafText);  
            Mass_Name_Message[i]="";
            }
         else if (i+num<=k) {
            Mass_Name_Message[i+num]=Mass_Name_Message[i];
            y=ObjectGet(NameGrafText, OBJPROP_YDISTANCE);               // координата Y
            ObjectSet  (NameGrafText, OBJPROP_YDISTANCE, y+(sz+1)*num); // координата Y
            ObjectSet  (NameGrafText, OBJPROP_COLOR, LightSeaGreen);    // цвет
            }
         }
      }
   shift=num;
   int v=GetTickCount();
   for (i=0; i<num; i++) {
      shift--;
      NameGrafText=Prefix+"_Graf_Text_"+i+"_"+sy+"_"+v;
      int app=0;
      while (ObjectFind(NameGrafText)==Win_Num) {
         app++;
         NameGrafText=Prefix+"_Graf_Text_"+i+"_"+sy+"_"+v+"_"+app;
         }
      Mass_Name_Message[num-1-i]=NameGrafText;
      switch (i) {
         case 0: message=mess1; cl=cl1; break;
         case 1: message=mess2; cl=cl2; break;
         case 2: message=mess3; cl=cl3; break;
         case 3: message=mess4; cl=cl4; break;
         default:message=mess1; cl=cl1; break;
         }
      ObjectCreate (NameGrafText, OBJ_LABEL, Win_Num, 0, 0);
      ObjectSetText(NameGrafText, message, sz, "Courier New", cl);
      ObjectSet    (NameGrafText, OBJPROP_COLOR, cl);                   // цвет
      ObjectSet    (NameGrafText, OBJPROP_CORNER,    2);                // угол
      ObjectSet    (NameGrafText, OBJPROP_XDISTANCE, 150);              // координата Х
      ObjectSet    (NameGrafText, OBJPROP_YDISTANCE, 2+(sz+1)*shift);   // координата Y
      WindowRedraw();
      }
   return;
}
//+----------------------------------------------------------------------------+

Busca la ventana vacía del indicador Win_Inform en el gráfico y, si está presente, muestra los mensajes en ella. Si no es así, lo emite con la impresión.

Ejemplo de llamada:

//-------------------------------------------------------
   message1=StringConcatenate("Тик: ",GetTickCount()," ");
   message2=StringConcatenate("Цена Bid: ", DoubleToStr(Bid,dg));
   iPrint(false, message1, message2, "", "", 9, Aqua, DarkOrange);
   b=4; c=7;
   a=b+c;
   message1=StringConcatenate("a=",a," ");
   message2=StringConcatenate("b=",b," ");
   message3=StringConcatenate("c=",c);
   iPrint(false, message1, message2, message3, "", 9, Aqua, LimeGreen, DarkOrange);
   
   message1=StringConcatenate("Время: ", TimeToStr(TimeCurrent())," ");
   message2=StringConcatenate("Тик: ",GetTickCount()," ");
   message3=StringConcatenate("Время бара: ",TimeToStr(Time[0])," ");
   message4=StringConcatenate("Цена Bid: ", DoubleToStr(Bid,dg));
   iPrint(false, message1, message2, message3, message4, 9, Aqua, Aqua, Aqua, DarkOrange);
//-------------------------------------------------------

Utiliza la matriz Mass_Name_Message[10] declarada a nivel global. Es un array para almacenar los nombres de los objetos. Puedes cambiar su tamaño para adaptarlo a tus necesidades. La variable Prefix almacena los nombres de los expertos para permitirles identificar sus propios objetos para el correcto manejo de los objetos gráficos. También se declara globalmente y tiene el tipo de cadena. Probablemente puedas imaginarlo...

Pavo en un remolque

Archivos adjuntos:
 

Enfrentado a un pequeño problema con mi función:

void mycomment(color c,string mytext)
{
string name="mycomment";
if(ObjectFind(name)<0) ObjectCreate(name,OBJ_LABEL,0,0,0);
ObjectSet("mycomment", OBJPROP_CORNER, 2);
ObjectSet(name,OBJPROP_XDISTANCE,5);
ObjectSet(name,OBJPROP_YDISTANCE,7);
ObjectSetText(name,mytext,12,"",c);
}

Recorta un mensaje largo, por ejemplo si intentas comentar la línea "Comprueba la configuración de tu EA, para abrir la ventana de configuración pulsa F7".

sólo queda esto: "Comprueba la configuración de tu EA para abrir la ventana de configuración" y luego se corta, aunque el texto no llega ni a la mitad de la ventana.

¿Pueden decirme si hay alguna forma de eliminar esta restricción?

 

No, longitud máxima de la línea en la etiqueta = 62 caracteres.

Formatear el texto en varias líneas (etiquetas), o utilizar Comment() - hay 255 caracteres

 
¡Buenas tardes!
Me he encontrado con un problema al abrir un número determinado (definido por el usuario) de pedidos.
He escrito un pequeño código para resolver este problema.
Pero hay ocasiones en las que se abre un número arbitrario de órdenes, normalmente cerca del final de la prueba.

A continuación se muestra el código en sí.

extern string Kolichestvo_orderov = "Количество единовременно открытых ордеров";
extern int OrederBuy = 1;
extern int OrederSell = 1;


int OrdS=1,OrdB=1,ticketBuy,ticketSell,lastticketSell=0,lastticketBuy=0;

//========================================================================================================//     
                                  //---- Открытие ордеров SELL ----//
//========================================================================================================//

if(OrdS<=OrederSell)
  { //----- start
 
if(trendDn==true && SthFast>88.2 && SthSlow<38.2)
     {
ticketSell=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,0,magick,0,Blue);OrdS++; //--- Если ордер открыт параметр OrdS увеличиваю 
     }
   } //-----end
          
//========================================================================================================//  
                                   //----Открытие ордеров BUY ----//
//========================================================================================================//  

if(OrdB<=OrederBuy)
  { //-----start

if(trendUp==true && SthFast<11.8 && SthSlow>61.8)
      {
ticketBuy=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,0,magick,0,Red);OrdB++; //--- Если ордер открыт параметр OrdB увеличиваю
      }

  } //------end
  

//------------------------------- Подсчет количества ордеров BUY & SELL ----------------------------------//
   
  if(ticketBuy<=OrdersHistoryTotal()) //------ проверка тикетов тех  ордеров которые уже закрыты
   {
  for(int ordBuy=lastticketBuy;ordBuy<=OrdersHistoryTotal();ordBuy++) //--- перебор новых закрытых ордеров
    {
     if(OrderSelect(ordBuy,SELECT_BY_POS,MODE_HISTORY)==true){if(OrderType()==OP_BUY)OrdB--;lastticketBuy=ticketBuy;} //--- если добавился новый закрытый ордер бай, то параметр OrdB уменьшаю
    }
   }
  
  //-----
    
 if(ticketSell<=OrdersHistoryTotal()) //------ проверка тикетов тех  ордеров которые уже закрыты
  {
 for(int ordSell=lastticketSell;ordSell<=OrdersHistoryTotal();ordSell++) //--- перебор новых закрытых ордеров
     {
     if(OrderSelect(ordSell,SELECT_BY_POS,MODE_HISTORY)==true){if(OrderType()==OP_SELL)OrdS--;lastticketSell=ticketSell;} //--- если добавился новый закрытый ордер селл, то параметр OrdS уменьшаю

Si tienes una solución más sencilla, estaré encantado de recibir comentarios.

 
Lians:

Enfrentado a un pequeño problema con mi función:

void mycomment(color c,string mytext)
{
string name="mycomment";
if(ObjectFind(name)<0) ObjectCreate(name,OBJ_LABEL,0,0,0);
ObjectSet("mycomment", OBJPROP_CORNER, 2);
ObjectSet(name,OBJPROP_XDISTANCE,5);
ObjectSet(name,OBJPROP_YDISTANCE,7);
ObjectSetText(name,mytext,12,"",c);
}

Recorta un mensaje largo, por ejemplo si intentas comentar la línea "Comprueba la configuración de tu EA, para abrir la ventana de configuración pulsa F7".

sólo queda esto: "Comprueba la configuración de tu EA para abrir la ventana de configuración" y luego se corta, aunque el texto no llega ni a la mitad de la ventana.

¿Pueden decirme si hay alguna forma de eliminar esta restricción?

Prueba mi función. Está por encima de su puesto en esta página. Dividir una cadena en varias cadenas para que cada una no tenga más de 64 caracteres. Mi función emite estas líneas divididas una encima de la otra. Entonces, cuando se muestra el siguiente mensaje, pone en escala de grises los antiguos por encima, y muestra el nuevo mensaje en el color que usted estableció cuando llamó a mi función.
 
Descargué el historial y accidentalmente descubrí que tengo un agujero en USDJPY desde 2012.01.16 hasta 2012.03.20. Cuando intenté volver a descargarlo, el terminal me respondió que tenía todo el historial.
¿Cómo puedo llenar este vacío?
¿Cómo puedo cargar el historial sin agujeros?
¿Y hay alguna forma de comprobar si hay un agujero en el historial?
 
artmedia70:
Prueba mi función. Está por encima de su puesto en esta página. Dividir una cadena en varias cadenas para que cada una no tenga más de 64 caracteres. Mi función emite estas líneas divididas una encima de la otra. Entonces, cuando se muestra el siguiente mensaje, pone en escala de grises los antiguos por encima, y muestra el nuevo mensaje en el color que usted estableció cuando llamó a mi función.
Gracias, pero es un poco complicado para mí, y tu función emite 4 mensajes a la vez, mientras que yo necesito uno. ¿Resulta que no hay más de 64 caracteres en una línea?