[ARCHIV!] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen - 4. - Seite 65

 

Roll, danke für den Tipp, hier ist eine Funktion zur Anzeige eines Kommentars in der linken unteren Ecke des Diagramms, falls jemand es braucht:

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

 
Können Sie mir sagen, wie ich eine Datei in einem Skript wieder öffnen kann: Datei öffnen - durchsehen - Datei schließen, wenn ich versuche, sie wieder zu öffnen, sagt sie "Ende der Datei"...
 
Hallo, können Sie mir sagen, ob jemand schon einmal auf dieses Problem gestoßen ist: Im Währungsdiagramm-Fenster verschwindet manchmal das Diagramm selbst, dann heißt es Refresh und alles ist wieder da. Zu diesem Zeitpunkt fangen die Expertenberater manchmal an, fehlerhaft zu arbeiten (Eröffnung von Geschäften ohne Bedingungen). Heute sogar einen Handel mit maximalem Lot eröffnet. Ich habe es bemerkt und mit 2,5 Punkten Verlust geschlossen. Hier ist der Code für die Bestimmung des Loses. Ich denke, dass dies nicht der Fall sein sollte. Ich vermute, dass dies an den letzten beiden Zeilen liegt. Aber wie?
//========================================================================                                                                              
//определение лота
//========================================================================

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:

Hallo zusammen!

Können Sie mir sagen, ob es möglich ist, Text in einem Diagramm anzuzeigen, z. B.

Ausgabe als separate Funktion, so dass sie wie folgt aufgerufen werden kann:

Sehen Sie sich diese Funktion an:

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

Es sucht nach einem leeren Win_Inform-Indikatorfenster auf dem Chart und zeigt, falls vorhanden, Meldungen darin an. Wenn nicht, wird es mit print ausgegeben.

Beispielanruf:

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

Verwendet das auf globaler Ebene deklarierte Array string Mass_Name_Message[10]. Dies ist ein Array zum Speichern von Objektnamen. Sie können die Größe an Ihre Bedürfnisse anpassen. Die Prefix-Variable speichert Namen von Experten, damit diese ihre eigenen Objekte identifizieren können, um eine korrekte Handhabung von grafischen Objekten zu ermöglichen. Sie wird ebenfalls global deklariert und hat den Typ String. Sie können es wahrscheinlich herausfinden...

Truthahn in einem Anhänger

Dateien:
 

Ich bin mit einem kleinen Problem mit meiner Funktion konfrontiert:

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

Es schneidet eine lange Nachricht ab, z. B. wenn Sie versuchen, die Zeile "Überprüfen Sie Ihre EA-Einstellungen, um das Einstellungsfenster zu öffnen, drücken Sie F7" zu kommentieren.

bleibt nur dies übrig: "Überprüfen Sie Ihre EA-Einstellungen, um das Einstellungsfenster zu öffnen", und dann wird er abgeschnitten, obwohl der Text nicht einmal zur Hälfte des Fensters steht.

Können Sie mir bitte sagen, ob es eine Möglichkeit gibt, diese Beschränkung aufzuheben?

 

Nein, maximale Zeilenlänge im Etikett = 62 Zeichen.

Formatieren Sie den Text in mehrere Zeilen (Beschriftungen), oder verwenden Sie Comment() - es sind 255 Zeichen möglich

 
Guten Tag!
Ich bin auf ein Problem beim Öffnen einer bestimmten (benutzerdefinierten) Anzahl von Aufträgen gestoßen.
Ich habe einen kleinen Code geschrieben, um dieses Problem zu lösen.
Es gibt jedoch Zeiten, in denen eine beliebige Anzahl von Aufträgen geöffnet wird, meist gegen Ende des Tests.

Nachstehend finden Sie den Code selbst.

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

Wenn Sie eine einfachere Lösung haben, würde ich mich über einen Kommentar freuen.

 
Lians:

Ich bin mit einem kleinen Problem mit meiner Funktion konfrontiert:

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

Es schneidet eine lange Nachricht ab, zum Beispiel wenn Sie versuchen, die Zeile "Überprüfen Sie Ihre EA-Einstellungen, drücken Sie F7, um das Einstellungsfenster zu öffnen" zu kommentieren.

bleibt nur dies übrig: "Überprüfen Sie Ihre EA-Einstellungen, um das Einstellungsfenster zu öffnen", und dann wird er abgeschnitten, obwohl der Text nicht einmal zur Hälfte des Fensters steht.

Können Sie mir bitte sagen, ob es eine Möglichkeit gibt, diese Beschränkung aufzuheben?

Versuchen Sie meine Funktion. Sie befindet sich über Ihrem Beitrag auf dieser Seite. Eine Zeichenfolge in mehrere Zeichenfolgen aufteilen, so dass jede Zeichenfolge nicht mehr als 64 Zeichen lang ist. Meine Funktion gibt diese geteilten Zeilen übereinander aus. Wenn dann die nächste Nachricht angezeigt wird, werden die alten Nachrichten oben in Graustufen dargestellt, und die neue Nachricht wird in der Farbe angezeigt, die Sie beim Aufruf meiner Funktion festgelegt haben.
 
Ich habe die Historie heruntergeladen und zufällig festgestellt, dass ich ein Loch in USDJPY von 2012.01.16 bis 2012.03.20 habe. Als ich versuchte, sie erneut herunterzuladen, antwortete das Terminal, dass ich den gesamten Verlauf habe.
Wie kann ich diese Lücke schließen?
Wie kann ich den Verlauf ohne Löcher hochladen?
Und gibt es eine Möglichkeit zu überprüfen, ob es eine Lücke in der Historie gibt?
 
artmedia70:
Versuchen Sie meine Funktion. Sie steht über Ihrem Beitrag auf dieser Seite. Eine Zeichenfolge in mehrere Zeichenfolgen aufteilen, so dass jede Zeichenfolge nicht mehr als 64 Zeichen lang ist. Meine Funktion gibt diese geteilten Zeilen übereinander aus. Wenn dann die nächste Nachricht angezeigt wird, werden die alten Nachrichten oben in Graustufen dargestellt, und die neue Nachricht wird in der Farbe angezeigt, die Sie beim Aufruf meiner Funktion festgelegt haben.
Danke, aber es ist ein bisschen kompliziert für mich, und Ihre Funktion gibt 4 Nachrichten auf einmal aus, während ich eine brauche. Es werden nicht mehr als 64 Zeichen in einer Zeile angezeigt?