[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 277

 
drknn:


Haben Sie das gesehen? https://book.mql4.com/ru/samples/index

Im Allgemeinen besteht Ihr Programm, wie jedes andere auch, aus einzelnen Blöcken, die jeweils eine Aufgabe erfüllen. Sie nehmen einen solchen Block und schreiben Ihren eigenen Code, debuggen ihn und gehen dann zum nächsten Block über. Und so weiter bis zum Ende des Programms.

Ich danke Ihnen...
 
evillive:

Guten Tag!

Bitte geben Sie mir einen Rat, wie ich eine Wohnung zuverlässig identifizieren kann, wenn es überhaupt eine gibt.

Es gibt sie. Ich rechne diese Woche auch auf dieser Grundlage ab.
 
evillive:

Guten Tag!
Bitte geben Sie mir einen Rat, wie ich eine Wohnung zuverlässig identifizieren kann, wenn es überhaupt eine gibt.

Ein Flat ist eine Kursbewegung, die aus einem oder mehreren Flat-Elementen besteht.
Ein Flat-Element ist ein Element der Kursbewegung, das entsteht, wenn sich der Kurs von seinem Ausgangspunkt in eine beliebige Richtung bewegt und anschließend wieder zu diesem Punkt zurückkehrt.

 

Für die Zustellung der Bestellung wird der folgende Befehl verwendet

tikett= OrderSend( Symbol(), OP_SELLSTOP,  volume*A, Price -otstup*Point, Point* 3,R2, Price-takeprofit*Point-otstup*Point, "OP_SELLSTOP" , 2000,  expiration,C'0,128,255' );

Der Befehl OrderSend befiehlt dem Roboter, die Order zu platzieren; das Währungspaar wird in Klammern an die erste Stelle geschrieben. Hier haben wir Symbol(), das uns das Währungspaar gibt, in dem der Expert Advisor platziert ist. Danach folgt der Name des Handelsunternehmens. Dann haben wir das Losvolumen und hier einen variablen Multiplikator. Preis, dann eine Abweichung von 3 Pips, Stop Loss, Take Profit, Name, magische Zahl - eine beliebige Zahl, die Sie gewählt haben, dann weiß ich nicht mehr, dann Farbe. Alles ist in dieser Reihenfolge. Sie können ohne tikett= auskommen, nur OrderSend.

Und hier heißt es aufpassen: Der Auftrag wird bei jedem Tick erteilt, bis hin zu Hunderten von Aufträgen, wenn er nur an den Anfang geschrieben wird. Wir brauchen Bedingungen, damit der Auftrag erteilt wird, wenn er notwendig ist. Beispiel.

for ( i=OrdersTotal();i>0;i--){ OrderSelect(i-1,SELECT_BY_POS );//Alert ("OrderType( )", OrderType( ));
 if( OrderMagicNumber( )==2000 &&OrderSymbol()==Symbol()) { 
if(OrderType( ) ==OP_SELLSTOP) { Y++;}
if(OrderType( ) ==OP_SELL) { Y++;}}}
Y=Y-dolivka1;//Alert ("Y++", Y," dolivka1 ",dolivka1);
 if (Y<=0){ // Alert ("Y", Y );
   tikett= OrderSend( Symbol(), OP_SELLSTOP,  volume*A, Price -otstup*Point, Point* 3,R2, Price-takeprofit*Point-otstup*Point, "OP_SELLSTOP" , 2000,  expiration,C'0,128,255' );
   // Alert ("OP_SELLSTOP", GetLastError( )); 
    Error=GetLastError( ); } J=0;

   if (Error !=0 ) { Print ( " Error OP_SELLSTOP " , Error , "tikett",tikett," volume*A ",volume*A," Price -otstup*Point ",Price -otstup*Point," Price-takeprofit*Point-otstup*Point ",Price-takeprofit*Point-otstup*Point, 
  " Ask ", Ask , " Bid " , Bid );
   Error=0;}

Müde. Verwenden Sie die Hilfe, um die fertigen Beispiele zu analysieren.

 
drknn:


Haben Sie es hier gesehen? https://book.mql4.com/ru/samples/index

Im Allgemeinen besteht Ihr Programm, wie jedes andere auch, aus einzelnen Blöcken, von denen jeder eine Aufgabe ausführt. Wir nehmen einen solchen Block und schreiben unseren eigenen Code, debuggen ihn von Ende zu Ende und gehen dann zum nächsten Block über. Und so geht es weiter bis zum Ende des Programms.


Nun, ich werde versuchen, genauer zu sein... Mein Expert Advisor öffnet erfolgreich EINE Pending Order und muss sie nach einiger Zeit ändern... Dazu muss ich seinen Index oder eine Positionsnummer in einem schwebenden Auftrag kennen. Wie kann ich diese Positionsnummer oder ihren Index erhalten? Müssen wir in einer for-Schleife nach Aufträgen suchen? Ich habe EINE Bestellung... Hier ist ein Teil des Codes meines Programms, der nicht funktioniert


if (OrderSelect (1, SELECT_BY_POS, MODE_TRADES)==true)

{ticket = OrderTicket();

return();}

Wie schreibe ich ihn richtig?

 
AlexLaptist:


Und doch werde ich versuchen, die Frage genauer zu stellen... Mein Expert Advisor öffnet erfolgreich EINE Pending Order und nach einiger Zeit muss er sie ändern... Dazu müssen wir seinen Index oder eine Positionsnummer in den schwebenden Aufträgen kennen. Wie kann ich diese Positionsnummer oder ihren Index erhalten? Müssen wir in einer for-Schleife nach Aufträgen suchen? Ich habe EINE Bestellung... Hier ist ein Teil des Codes meines Programms, der nicht funktioniert


if (OrderSelect (1, SELECT_BY_POS, MODE_TRADES)==true)

{ticket = OrderTicket();

return();}

Wie schreibe ich es richtig?


Die Funktion OrderSend() gibt bei erfolgreicher Ausführung die Nummer des Tickets der soeben geöffneten Bestellung zurück - dies ist ihre Sequenznummer auf dem Server, und es gibt keine weitere derartige Bestellung. Es besteht also keine Notwendigkeit, eine Rückverfolgung des Auftrags durchzuführen, es genügt, sich an das Ticket zu erinnern. Denken Sie einfach daran, sobald die Bestellung geöffnet wird.

int Ticket=OrderSend();
if(Ticket<0){
// тут принтуем сообщение об ошибке.
}
// Вам нужно всё равно создать счётчик ордеров, который обнулит переменную Ticket в том случае, если ордера в рынке больше нет.
 
drknn:


Die Funktion OrderSend() gibt bei erfolgreicher Ausführung die Nummer des Auftragstickets zurück, das sie gerade geöffnet hat - dies ist die Seriennummer auf dem Server, und es gibt keinen anderen Auftrag dieser Art. Es besteht also keine Notwendigkeit, eine Rückverfolgung des Auftrags durchzuführen, es genügt, sich an das Ticket zu erinnern. Denken Sie einfach daran, sobald die Bestellung geöffnet wird.

Und wie lange werden wir uns an ihn "erinnern"? Du könntest es verlieren...

IMHO sollten wir immer frische und aktuelle Informationen aufnehmen, wenn wir sie brauchen, anstatt sie je nach Anlass im Gedächtnis zu speichern.

Es wäre besser, die richtige Reihenfolge zu finden, bevor man sie ändert, als auf den Zufall zu hoffen... Für den Fall, dass zum Beispiel der Strom nicht abgeschaltet wird...

 
AlexLaptist:


Und doch werde ich versuchen, die Frage genauer zu stellen... Mein Expert Advisor öffnet erfolgreich EINE Pending Order und nach einiger Zeit muss er sie ändern... Dazu müssen wir seinen Index oder eine Positionsnummer in den schwebenden Aufträgen kennen. Wie kann ich diese Positionsnummer oder ihren Index erhalten? Müssen wir in einer for-Schleife nach Aufträgen suchen? Ich habe EINE Bestellung... Hier ist ein Teil des Codes meines Programms, der nicht funktioniert


if (OrderSelect (1, SELECT_BY_POS, MODE_TRADES)==true)

{ticket = OrderTicket();

return();}

Wie schreibe ich es richtig?

Vielleicht geht es in etwa so:

//+----------------------------------------------------------------------------+
int TicketLastSetOrder(string sy, int mn) { // 
   datetime t;
   int      i, op, ticket=-1;
   for (i=0; i<OrdersTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS)) {
         op=OrderType();
         if (OrderMagicNumber()!=mn)   continue;
         if (OrderSymbol()!=sy)        continue;
         if (op<2 || op>5)             continue;
         if (OrderOpenTime()>t)  {
            t=OrderOpenTime();
            ticket=OrderTicket();
            }
         }
      else Print("FUNC TicketLastSetOrder(): Error select order: "+GetLastError());
      }
   return(ticket);
}
//+----------------------------------------------------------------------------+

Gibt das Ticket der letzten gesetzten Bestellung oder -1 zurück

Bei einem Anruf geben Sie bitte das gewünschte Symbol und die Magie des EA an, zum Beispiel:

   int TicketMyOrder=TicketLastSetOrder(Symbol(), Magic);

Diese Funktion gibt das Ticket des letzten schwebenden Auftrags zurück, der für das aktuelle Symbol erteilt wurde (in Ihrem Fall der einzige). Magie - die magische Zahl deines EA

 

Sie können das Ticket auch in globalen Variablen ablegen. :) Man kann es überhaupt nicht mehr aus der Hand legen. Aber als Idee wird die Auswahl der Reihenfolge vor der Änderung funktionieren. Nur wenn es nicht notwendig ist, Lose nur 1 Mal für die gesamte Laufzeit eines Auftrags zurückzusetzen (und zwar mit einer einzigen Änderung) :) :).

Kurz gesagt, es gibt eine Menge Varianten :)

 

Bitte geben Sie mir einen Hinweis. Ich habe noch nicht ganz herausgefunden, wie die Indikatoren funktionieren. Mein Indikator wird nicht gezeichnet, wenn ich den Zeitrahmen wechsle, und er wird nur ab und zu gezeichnet. Aber manchmal klappt es, und zwar genau so, wie ich es wollte! Bitte sagen Sie mir, was es braucht.

//+------------------------------------------------------------------+
//|                                            ИндюкДимонакомпил.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#import "user32.dll"
   int   PostMessageA(int  hWnd,int  Msg,int  wParam,string lParam);
#import
#define WM_COMMAND                     0x0111
int delimiter = 0;

#property indicator_chart_window

#property indicator_buffers 3
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_color3 DarkBlue
double ВерхняячертаBuffer1[];
double НижняячертаBuffer2[];
double СинняячертаBuffer3[];
 double вершина; 
 double основание_первого_снижения;
 double начало;
 double вершина_волны_3;
 extern int T=4,K=200;
 int timeframe, start ;
 int бар_вершина ;
 int бар_основание_первого_снижения;
 int бар_начало;
int pereklutsatel;
double naklon,linija2; int P;extern int RO=-1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators

SetIndexStyle(0,DRAW_SECTION,STYLE_SOLID,2,CLR_NONE);//Alert ("SetIndexStyle ",GetLastError( ) );
  SetIndexBuffer(0,ВерхняячертаBuffer1);//Alert ("SetIndexBuffer ",GetLastError( ) );
   SetIndexEmptyValue(0,0.0);
   
   SetIndexStyle(1,DRAW_SECTION,STYLE_SOLID,2,CLR_NONE);//Alert ("SetIndexStyle ",GetLastError( ) );
  SetIndexBuffer(1,НижняячертаBuffer2);//Alert ("SetIndexBuffer ",GetLastError( ) ); 
   SetIndexEmptyValue(1,0.0);
   
   SetIndexStyle(2,DRAW_SECTION,STYLE_SOLID,T,CLR_NONE);//Alert ("SetIndexStyle ",GetLastError( ) );
  SetIndexBuffer(2,СинняячертаBuffer3);//Alert ("SetIndexBuffer ",GetLastError( ) ); 
   SetIndexEmptyValue(2,0.0);
   
   
  ObjectDelete("вершина");
  ObjectDelete("основание_первого_снижения  ");
   ObjectDelete("начало");
    ObjectDelete("точка4");
    ObjectDelete("пятая_точка!");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   ObjectDelete("вершина");
  ObjectDelete("основание_первого_снижения  ");
   ObjectDelete("начало");
    ObjectDelete("точка4");
    ObjectDelete("пятая_точка!");
   ObjectsDeleteAll(WindowOnDropped( ) , OBJ_TEXT);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int limit=Bars-counted_bars-1;

   for (int i=limit;i>=0;i--) {
//----
 for ( int J=0;J<=RO;J++){
//----

  // for(int i=Bars; i>=0;i--)
   i=Bars;
      бар_вершина=iHighest( NULL,  timeframe, MODE_HIGH, K, start ) ;
       вершина =High[ бар_вершина ];
       бар_основание_первого_снижения=iLowest( NULL,  timeframe, MODE_LOW,NormalizeDouble ( бар_вершина/2,0), start ) ;
       основание_первого_снижения=Low[ бар_основание_первого_снижения ];
       бар_начало=iLowest( NULL,  timeframe, MODE_LOW,NormalizeDouble (бар_вершина*1.5,0), бар_вершина ) ;
       начало=Low[ бар_начало ];
       
   ObjectCreate( "вершина",  OBJ_TEXT , WindowOnDropped( ) , Time[бар_вершина],  вершина+(10*Point)) ; 
    ObjectSetText( "вершина", "вершина", 5, "вершина",Crimson ) ;// Alert("GetLastError()",GetLastError());
      // ObjectSet(  "вершина",  OBJPROP_COLOR, Crimson) ;
      
   ObjectCreate( "основание_первого_снижения",  OBJ_TEXT , WindowOnDropped( ) , Time[бар_основание_первого_снижения],  основание_первого_снижения-(10*Point)) ; 
    ObjectSetText( "основание_первого_снижения", "основание_первого_снижения", 5, "основание_первого_снижения",Crimson ) ;   
   
    ObjectCreate( "начало",  OBJ_TEXT , WindowOnDropped( ) , Time[бар_начало],  начало-(10*Point)) ; 
    ObjectSetText( "начало", "начало", 5, "начало",Crimson ) ;   
           
  if(начало>основание_первого_снижения){naklon=(начало-основание_первого_снижения)/(бар_начало-бар_основание_первого_снижения);
 // Alert("naklon  ", naklon);
    НижняячертаBuffer2[бар_начало]=начало;linija2=начало;for(i=бар_начало-1;i>=0;i--){linija2=linija2-naklon;
   
    НижняячертаBuffer2[i]=linija2;  // Alert ("linija2  " , linija2 ); 
     Alert("НижняячертаBuffer2[i]  ", НижняячертаBuffer2[i] , "  i " , i);
     
   }
    НижняячертаBuffer2[бар_основание_первого_снижения]=основание_первого_снижения;}
    
    
         for (i=0;i<100;i++){  СинняячертаBuffer3[i]= Open[i];}
          for (i=330;i<500;i++){  СинняячертаBuffer3[i]= Open[i];}

     ВерхняячертаBuffer1[бар_начало]=начало;
     
 double точка4; int бар_точка4;   бар_точка4=iHighest( NULL,  timeframe, MODE_HIGH, бар_основание_первого_снижения, 3 ) ; 
  точка4 =High[ бар_точка4 ];  
   
   if(вершина>точка4){naklon=(начало-точка4)/(бар_начало-бар_точка4);
   ObjectCreate( "точка4",  OBJ_TEXT , WindowOnDropped( ) , Time[бар_точка4],  точка4+(10*Point)) ; 
    ObjectSetText( "точка4", "точка4", 5, "точка4",Crimson ) ;  
   double linija1=начало;for(i=бар_начало-1;i>=0;i--){linija1=linija1-naklon;ВерхняячертаBuffer1[i]=linija1; }}
   
double vulf=НижняячертаBuffer2[0];
  if ( vulf==Ask||vulf==Bid){vulf=1;}
 if (vulf+(10*Point)>Ask&&vulf-(10*Point)<Bid){vulf=1 ;} 
           
      Alert ("vulf  " , vulf );   Comment ("  vulf!!! "  , vulf);  
   if (vulf==1){Comment ("  Есть вульв!!! "  , "  timeframe " , timeframe);
   ObjectCreate( "пятая_точка!",  OBJ_TEXT , WindowOnDropped( ) , Time[0],  Bid-(10*Point)) ; 
    ObjectSetText( "пятая_точка!", "пятая_точка!", 5, "пятая_точка!",Crimson ) ;   return(0);  }
    if (vulf!=1) {    
   
     if(delimiter<3){delimiter++;Comment(delimiter);return(0);}
   delimiter=0;
    fChangePeriod();P++;
                                 
                   }  } }
//----
   return(0);
  }
//+------------------------------------------------------------------+

void fChangePeriod(){int ii,hwd = WindowHandle(Symbol(),Period());
   switch(Period()){
      case PERIOD_W1    : ii = 33134; break; //PERIOD_D1;
      case PERIOD_D1    : ii = 33136; break; //PERIOD_H4;
      case PERIOD_H4    : ii = 33135; break; //PERIOD_H1;
      case PERIOD_H1    : ii = 33140; break; //PERIOD_M30;
      case PERIOD_M30   : ii = 33139; break; //PERIOD_M15;
      case PERIOD_M15   : ii = 33138; break; //PERIOD_M5;
      case PERIOD_M5    : ii = 33137; break; //PERIOD_M1;
      case PERIOD_M1    : ii = 33141; break; //PERIOD_W1;
   }     
   PostMessageA(hwd, WM_COMMAND, ii, 0);
   return;
}