[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 4. - pagina 65

 

Roll, grazie per il suggerimento, ecco una funzione per visualizzare un commento nell'angolo in basso a sinistra del grafico se qualcuno ne ha bisogno:

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);
}

 
Potete dirmi come riaprire un file in uno script: aprire il file - guardare fino alla fine - chiudere il file, quando si prova a riaprire dice "fine del file" ...
 
Salve, potete consigliarmi se qualcuno ha riscontrato questo problema: nella finestra del grafico delle valute, a volte il grafico stesso scompare, poi dice refresh e tutto viene ripristinato. In questo momento, a volte i consulenti esperti iniziano a lavorare in modo errato (aprendo operazioni senza condizioni). Oggi ha anche aperto un trade con lotto massimo. L'ho notato e ho chiuso con 2,5 punti di perdita. Ecco il codice per determinare il lotto. Ho il sospetto che ciò sia dovuto alle ultime due righe. Ma come?
//========================================================================                                                                              
//определение лота
//========================================================================

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:

Ciao a tutti!

Potete dirmi se è possibile visualizzare del testo su un grafico, come

come una funzione separata in modo che possa essere chiamata in questo modo:

Guardate questa funzione:

//+----------------------------------------------------------------------------+
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;
}
//+----------------------------------------------------------------------------+

Cerca la finestra vuota dell'indicatore Win_Inform sul grafico e, se è presente, visualizza i messaggi in essa. Se non lo è, esce con la stampa.

Esempio di chiamata:

//-------------------------------------------------------
   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);
//-------------------------------------------------------

Utilizza l'array stringa Mass_Name_Message[10] dichiarato a livello globale. Questo è un array per memorizzare i nomi degli oggetti. Potete cambiare le sue dimensioni in base alle vostre esigenze. La variabile Prefix memorizza i nomi degli esperti per permettere loro di identificare i propri oggetti per una corretta gestione degli oggetti grafici. È anche dichiarato globalmente e ha il tipo stringa. Probabilmente puoi capirlo...

Tacchino in un rimorchio

File:
 

Di fronte a un piccolo problema con la mia funzione:

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);
}

Taglia un messaggio lungo, per esempio se si cerca di commentare la linea "Controlla le tue impostazioni EA, per aprire la finestra delle impostazioni premi F7".

rimane solo questo: "Controlla le tue impostazioni EA per aprire la finestra delle impostazioni" e poi si interrompe, anche se il testo non è nemmeno a metà della finestra.

Potete dirmi se c'è un modo per rimuovere questa restrizione?

 

Non puoi, lunghezza massima della linea nell'etichetta = 62 caratteri.

Formattare il testo in linee multiple (etichette), o usare Comment() - ci sono 255 caratteri

 
Buon pomeriggio!
Ho riscontrato un problema con l'apertura di un certo numero di ordini(definito dall'utente).
Ho scritto un piccolo codice per risolvere questo problema.
Ma ci sono momenti in cui viene aperto un numero arbitrario di ordini, di solito verso la fine del test.

Qui sotto c'è il codice stesso.

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 уменьшаю

Se avete una soluzione più semplice, sarei felice di ricevere commenti.

 
Lians:

Di fronte a un piccolo problema con la mia funzione:

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);
}

Taglia un messaggio lungo, per esempio se si cerca di commentare la linea "Controlla le tue impostazioni EA, per aprire la finestra delle impostazioni premi F7".

rimane solo questo: "Controlla le tue impostazioni EA per aprire la finestra delle impostazioni" e poi si interrompe, anche se il testo non è nemmeno a metà della finestra.

Potete dirmi se c'è un modo per rimuovere questa restrizione?

Prova la mia funzione. È sopra il tuo post in questa pagina. Divide una stringa in più stringhe in modo che ogni stringa non sia più lunga di 64 caratteri. La mia funzione emette queste linee divise una sopra l'altra. Poi, quando il prossimo messaggio viene visualizzato, scala in grigio quelli vecchi sopra, e visualizza il nuovo messaggio nel colore che avete impostato quando avete chiamato la mia funzione.
 
Ho scaricato la cronologia e ho scoperto per caso che ho un buco in USDJPY dal 2012.01.16 al 2012.03.20. Quando ho provato a riscaricarlo, il terminale mi ha risposto che ho tutta la storia.
Come posso colmare questa lacuna?
Come posso caricare la storia senza buchi?
E c'è un modo per controllare se c'è un buco nella storia?
 
artmedia70:
Prova la mia funzione. È sopra il tuo post in questa pagina. Divide una stringa in più stringhe in modo che ogni stringa non sia più lunga di 64 caratteri. La mia funzione emette queste linee divise una sopra l'altra. Poi, quando il prossimo messaggio viene visualizzato, scala in grigio quelli vecchi sopra, e visualizza il nuovo messaggio nel colore che avete impostato quando avete chiamato la mia funzione.
Grazie, ma è un po' complicato per me, e la tua funzione emette 4 messaggi in una volta sola, mentre io ho bisogno di uno solo. Risulta che non ci sono più di 64 caratteri in una riga?