[Archiv!] Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht daran vorbei. Könnte nirgendwo ohne dich hingehen - 2. - Seite 84

 
NameLess:


Wie Sie vielleicht bemerkt haben, geht es nicht darum, sich den Code anzusehen, sondern zu verstehen, wie er funktioniert. Wenn Sie dem Expert Advisor vertrauen, wünsche ich Ihnen viel Erfolg und dass alles klappen wird)

Ich habe selbst ein Fahrrad erfunden und meine Eule von Grund auf neu geschrieben, aber ich weiß, wo und wie die Dinge funktionieren und weiß, warum sie nicht funktionieren und wo ich nach Fehlern suchen muss.)

das war's)


Ich danke Ihnen. Ich bin schon auf dem richtigen Weg!))) Ich musste ein bisschen herumwühlen, aber ich habe verstanden, was ich wollte (zumindest funktioniert es irgendwie :))) ).
 
NameLess:
Wissen Sie, wie man eine Auftragsnummernkontrolle einrichtet? Ich stimme zu, dass die Frage wahrscheinlich ein unverhohlenes Lächeln hervorruft, das an manchen Stellen in Gelächter übergeht.))) Aber ich stöbere erst seit etwa einer Woche in den mt-sh-Codes herum. Ich kenne immer noch nicht alle Wörter )))) Klug )))
 
nemo811:
Wissen Sie, wie man eine Auftragsnummernkontrolle einrichtet? Ich stimme zu, dass die Frage wahrscheinlich ein unverhohlenes Lächeln hervorruft, das an manchen Orten in Gelächter übergeht)))) Aber ich stöbere erst seit etwa einer Woche in den mt-sh-Codes herum. Ich kenne immer noch nicht alle Wörter )))) smart )))


ich kann mich nicht als Experte bezeichnen)))

Ich bin mir nicht ganz sicher, was die Nummernkontrolle bedeutet: Wenn Sie einen Auftrag unter bestimmten Bedingungen zweimal öffnen müssen, dann müssen Sie diese Bedingung erstellen.

Im Allgemeinen habe ich vor etwa einem halben Jahr begonnen, mein eigenes Programm zu schreiben, und ein einfaches Detail hat mir dabei geholfen: Überlegen Sie sich, was der EA oder ein bestimmtes Codestück tun soll.

In diesem Fall wäre es einfacher, ein Beispiel zu nennen, und dann kann ich genauer sagen, was zu tun ist und wie es zu tun ist, wenn ich die Lösung kenne:)

 

Beispiel auf Seite 83, Aufgabe von sergeev

Der Code hat funktioniert - vielen Dank. Aber wenn erfahrene Leute solche Worte sagen, fragt man sich schon, was los ist.

)))

 
nemo811:

Beispiel auf Seite 83, Aufgabe von sergeev

Der Code hat funktioniert - vielen Dank. Aber wenn erfahrene Menschen solche Worte sagen, fragt man sich schon, was los ist.

)))


Wenn der Code tut, was er tun soll - dann ist es das))), was ich wahrscheinlich meinte, war, dass der Code Aufträge nonstop öffnen kann, aber wir haben es so gemacht, dass alles einmal geöffnet und verschoben wird, also ist es OK)
 
NameLess:

Wenn der Code das tut, was er tun soll, dann ist es in Ordnung.)) Was ich wahrscheinlich meinte, war, dass der Code Aufträge ohne Unterbrechung öffnen kann, aber wir haben es einmal pro Öffnung und Verschiebung gemacht.)

Gut. Ich danke Ihnen nochmals.
 
nemo811:

Übrigens, ich empfehle, etwas zu schreiben wie

if ( OrdersTotal()!=0)

{

BUY = false;

BUY_STOP = false;

BUY_LIMIT = false;

SELL = false;

SELL_STOP = false;

SELL_LIMIT = false;

}

Dies ist ein Schutz für den Fall, dass Sie offene Positionen haben und den Client neu starten müssen. Andernfalls wird ein ganzer Auftragsstapel neu geöffnet.

Ich empfehle auch zu fragen: Denken Sie logisch über jede Zeile nach - was kann verhindern, dass sie funktioniert.

 
nemo811:

Hier ist eine leicht veraltete Version dessen, woran ich gerade arbeite. Der Autor drknnn gab mir die Erlaubnis, es hochzuladen.


Er hat nicht nur die Erlaubnis gegeben, ihn zu veröffentlichen, sondern auch die Erlaubnis, den Code nach Belieben zu ändern, ihn zu verkaufen und sogar ein Urheberrecht daran zu vergeben, an wen auch immer man will :)

Lassen Sie sich nur nicht auf einen Streit über die Rechte dort ein :)

 
Ich danke Ihnen!
 
NameLess:

Übrigens, ich empfehle, etwas zu schreiben wie

if ( OrdersTotal()!=0)

{

BUY = false;

....

dies ist ein Schutz für den Fall, dass Sie offene Positionen haben und den Client neu starten müssen. andernfalls wird ein ganzer Auftragsstapel neu geöffnet

Vielen Dank - das ist ein wichtiger Punkt. Ich habe dieses Problem gelöst und Zähler (dank sergeev) zum Zählen von Aufträgen hinzugefügt.

Der Code sieht nun wie folgt aus (es werden keine unnötigen Daten beim Neustart des Terminals geöffnet):

//--------------------------------------------------------------------
extern int     MAGIC       = 0;        //уникальный номер ордера
extern bool    BUY         = false;    //открыть ордер BUY
extern bool    BUY_STOP    = false;    //поставить ордер BUY STOP
extern bool    BUY_LIMIT   = false;    //поставить ордер BUY LIMIT
extern bool    SELL        = false;    //открыть ордер SELL
extern bool    SELL_STOP   = false;    //поставить ордер SELL STOP
extern bool    SELL_LIMIT  = false;    //поставить ордер SELL LIMIT
extern double  Lot         = 0.1;      //объем ордера
extern int     takeprofit  = 0;        //уровень выставления TP, если 0, то TP не выставляется
extern int     stoploss    = 0;        //уровень выставления SL, если 0, то SL не выставляется
extern int     DistanceSet = 40;       //расстояние от рынка для отложенника
extern int     Proskalz    = 3;        //максимально допустимое отклонение цены для рыночных ордеров
//--------------------------------------------------------------------
double SL,TP;
//--------------------------------------------------------------------
int start()
{
   if (BUY)
   {
      if (takeprofit!=0) TP  = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL  = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0;     
      OPENORDER ("Buy");
      BUY=false;
   }
   if (SELL)
   {  
      if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL = NormalizeDouble(Bid + stoploss*Point,Digits);  else SL=0;              
      OPENORDER ("Sell");
      SELL=false;
   }
   if (BUY_STOP)
   {
      if (takeprofit!=0) TP  = NormalizeDouble(Ask + DistanceSet*Point + takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL  = NormalizeDouble(Ask + DistanceSet*Point - stoploss*Point,Digits); else SL=0;     
      OPENORDER ("Buy Stop");
      BUY_STOP=false;
   }
   if (SELL_STOP)
   {  
      if (takeprofit!=0) TP = NormalizeDouble(Bid - DistanceSet*Point - takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL = NormalizeDouble(Bid - DistanceSet*Point + stoploss*Point,Digits);  else SL=0;              
      OPENORDER ("Sell Stop");
      SELL_STOP=false;
   }
   if (BUY_LIMIT)
   {
      if (takeprofit!=0) TP  = NormalizeDouble(Ask - DistanceSet*Point + takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL  = NormalizeDouble(Ask - DistanceSet*Point - stoploss*Point,Digits); else SL=0;     
      OPENORDER ("Buy Limit");
      BUY_LIMIT=false; 
   }
   if (SELL_LIMIT)
   {  
      if (takeprofit!=0) TP = NormalizeDouble(Bid + DistanceSet*Point - takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL = NormalizeDouble(Bid + DistanceSet*Point + stoploss*Point,Digits);  else SL=0;              
      OPENORDER ("Sell Limit");
      SELL_LIMIT=false;
   }
return(0);
}
void OPENORDER(string ord)
{
   int SchBuy=SchBuy_b(MAGIC);
   int SchSell=SchSell_b(MAGIC);
   int SchBuyStop=SchBuyStop_b(MAGIC);
   int SchSellStop=SchSellStop_b(MAGIC);
   int SchBuyLimit=SchBuyLimit_b(MAGIC);
   int SchSellLimit=SchSellLimit_b(MAGIC);
   int ticket = -1;
   int err;
   while (ticket<0)
   {
      if (SchBuy<1) {if (ord=="Buy") ticket=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchSell<1) {if (ord=="Sell") ticket=OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchBuyStop<1) {if (ord=="Buy Stop") ticket=OrderSend(Symbol(),OP_BUYSTOP, Lot,NormalizeDouble(Ask + DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchSellStop<1) {if (ord=="Sell Stop") ticket=OrderSend(Symbol(),OP_SELLSTOP,Lot,NormalizeDouble(Bid - DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchBuyLimit<1) {if (ord=="Buy Limit") ticket=OrderSend(Symbol(),OP_BUYLIMIT, Lot,NormalizeDouble(Ask - DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchSellLimit<1) {if (ord=="Sell Limit") ticket=OrderSend(Symbol(),OP_SELLLIMIT,Lot,NormalizeDouble(Bid + DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}      
      if (ticket==-1) //неудачная попытка
      {  
         ShowERROR();
         err++;Sleep(2000);RefreshRates();
      }
      if (ticket || err >10) return;
   }
return;
}                                    
//--------------------------------------------------------------------
void ShowERROR()
{
   int err=GetLastError();
   switch ( err )
   {                  
      case 1:   return;
      case 2:   Alert("Нет связи с торговым сервером ",Symbol());return;
      case 3:   Alert("Error неправильные параметры ",Symbol());return;
      case 130: Alert("Error близкие стопы   Ticket ",Symbol());return;
      case 134: Alert("Недостаточно денег   ",Symbol());return;
      case 146: Alert("Error Подсистема торговли занята ",Symbol());return;
      case 129: Alert("Error Неправильная цена ",Symbol());return;
      case 131: Alert("Error Неправильный объем ",Symbol());return;
      case 4200:Alert("Error Объект уже существует ",Symbol());return;
      default:  Alert("Error  " ,err," ",Symbol());return;
   }
}

+ entsprechende Zähler.

Ich danke Ihnen.

Grund der Beschwerde: