[WARNUNG GESCHLOSSEN!] Alle Fragen von Neulingen, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen. - Seite 13

 
keekkenen >> :

Die Sache ist die, dass die OrderClose()-Funktion, die den Auftrag schließt, die Auftragsnummer als ersten Parameter benötigt, und die Auftragsnummer kann nur durch den Aufruf von OrderSelect() bei bestehenden Aufträgen erhalten werden, so dass der Abschluss im allgemeinen Fall wie folgt aussieht...


Wenn OrdersTotal() = 0 ist, d.h. wenn es keine offenen Aufträge gibt, wird die for-Schleife sofort beendet.



Vielen Dank für die Antwort, können Sie den Anfang der OrderSend-Funktion schreiben? es sollte direkt nach der letzten Klammern gehen????

 
vadim2304 >> :

Vielen Dank für die Antwort, können Sie den Anfang der OrderSend-Funktion schreiben? es sollte direkt nach der letzten Klammern gehen????

Nun, hier ein Beispiel

#define              OP_BALANCE     6
int                  TRY            = 1;     
int                  TRADESLEEP     = 1000;  
int                  SLIPPAGE       = 3;

int start(){
   //  ничего не делать   
   int action = OP_BALANCE;

   if ( isTime(Period()*60)) {
      // закрываем ордера по текущему инструменту
      closeAllOrdersBySymbol( SLIPPAGE, TRY, TRADESLEEP);
   
   // получаем условие покупать, продавать, ничего не делать   
   action = getAction();
   
   if ( action== OP_BALANCE) return(0);
   
   // для примера минимальный лот   
   double lots = MarketInfo(Symbol(),MODE_MINLOT);
   
   //количество пунктов для стоплоса и текпрофита - сами определите
   int slPoint = 0, tpPoint = 0;
      
   string сomment = "";// значение для комментария по умолчанию
   int magicNumer = 0;// значение по умолчанию
   
   // открываем позицию - while используется для того чтобы открывать позицию пока она не откроется
   while(! openOrder( action, lots, slPoint, tpPoint, SLIPPAGE, сomment, magicNumer, TRY, TRADESLEEP)){}
   }
   return(0);     
}   
//+------------------------------------------------------------------+
//|  открывает  позицию по рынку                                     |
//+------------------------------------------------------------------+
int getAction(){
   int act = OP_BALANCE;
   
   /* здесь нужно написать логику, 
      если что-то, то покупать act = OP_BUY;
      если что-то, то продавать act = OP_SELL;   
   */
   return( act);
}
//+------------------------------------------------------------------+
//|  открывает  позицию по рынку                                     |
//+------------------------------------------------------------------+
bool openOrder(int type, double lots, int slPoint, int tpPoint, int slippage, string comment, 
               int magicNumer, int try, int tradeSleep){    
   bool res = false;
   int err = 0;   
   double price, tp = 0, sl = 0, ask = 0, bid = 0;  
   color col = CLR_NONE;
   Comment("Открытие ордера...");      
   
   while ( try != 0){
      while (IsTradeContextBusy() || !IsTradeAllowed()) {Comment("Торговый поток занят...");Sleep( tradeSleep);}        
      RefreshRates(); 
      ask = MarketInfo(Symbol(),MODE_ASK);
      bid = MarketInfo(Symbol(),MODE_BID);   
      if ( type==OP_BUY)  {
         price = ask; col = Red;
         if ( slPoint > 0) sl = bid - slPoint*Point; 
         if ( tpPoint > 0) tp = ask +  tpPoint*Point;
      }
      
      if ( type==OP_SELL) {
         price = bid; col = Blue;
         if ( slPoint > 0) sl = ask + slPoint*Point; 
         if ( tpPoint > 0) tp = bid - tpPoint*Point;   
      }           
            
      if ( type==OP_BUY && AccountFreeMarginCheck(Symbol(),OP_BUY, lots) <= 0 || GetLastError()==134) 
         {Comment("Недостаточно свободных средств !"); Sleep(2000);return( res);}
      if ( type==OP_SELL && AccountFreeMarginCheck(Symbol(),OP_SELL, lots) <= 0 || GetLastError()==134)
         {Comment("Недостаточно свободных средств !"); Sleep(2000);return( res);}            
      
      res = OrderSend(Symbol(), type, lots, price, slippage, sl, tp, comment, magicNumer,0, col);
      if ( res!=-1){    
         PlaySound("alert.wav");    
         try = 0;                          
         Comment("Ордер открыт !");          
      }else{
         err = GetLastError();
         if ( err > 1) try = 0;
         Comment("Ошибка - ", err);          
      }  
      Sleep(2000);       
   }  
   return( res);
}
//+------------------------------------------------------------------+
//|  закрытие одеров
//+------------------------------------------------------------------+  
bool closeAllOrdersBySymbol(int slippage,int try, int tradeSleep){
   int k = OrdersTotal(), err, nextTry;
   string msg = "";
   bool res = false;  
   
   for (int i = 0; i < k; i++) {
      if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES) &&
         OrderSymbol()==Symbol()){ 
         nextTry = try;            
         while ( nextTry != 0){
            while (IsTradeContextBusy() || !IsTradeAllowed())
               {Comment("Торговый поток занят ...");Sleep( tradeSleep);}               
            res = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(), slippage,CLR_NONE);
            if ( res){                      
               nextTry = 0;
               res = true;    
               Comment("Ордер закрыт !");              
            }else{                                                          
               if ( err > 1) nextTry = 0;  
               Comment("Ошибка - ", err);        
            }                            
         }                         
      }
   }  
   return( res);
}
//+------------------------------------------------------------------+  
bool isTime(int sec){
   bool res = false;
   static datetime time = 0;
   double min = 0;
   if (TimeCurrent() >= time){
      min = MathFloor( sec / 60);
      if ( min==0) min = 1.0;         
      time = iTime(NULL,PERIOD_H1,0) + (MathFloor(Minute()/ min) + 1) * min * 60;
      res = true;
   } 
   return( res);
}
 
Einfache Frage an die Programmierer:

Können Sie mir sagen, welche Funktion den Wert des Margin-Levels (in Prozent) für offene Aufträge zurückgibt, der auf der Registerkarte "Handel" angezeigt wird?

In der Hilfe gibt keine der aufgeführten Funktionen diesen Wert zurück.

AccountMargin

AccountFreeMargin
AccountFreeMarginCheck
AccountFreeMarginMode
 
khorosh >> :

Der Damiani_Volt Indikator kann verwendet werden.

Interessantes Material, danke.

 
keekkenen >> :
das ist es

Dankeschön

 
satop >> :

Ich weiß nicht, warum Sie denken, dass ich wütend bin.

Das ist nur meine Art, zu erklären, dass

indem sie jedes Zeichen von Ungleichheit aufgreifen und

>> im Prüfgerät können Sie einen positiven

das Ergebnis mit irgendeinem Niveau, und es spielt keine Rolle, welches Niveau

positiv oder negativ. Und auf die Frage

ob Sie die Stufe mit oder ohne Minuszeichen nehmen wollen,

Es gibt leider keine klare Unterscheidung.


Ich habe vielleicht einen Fehler gemacht..........

Das Problem ist, dass der Anfänger fragt, was er NICHT WISSEN kann. Dieser Beispielcode dient dazu, die Struktur (korrekte Struktur) des EA zu verstehen.

Und was in diesem Stück Code steckt, basiert auf einem KLASSISCHEN Handelsprinzip. Sowohl der Expert Advisor selbst als auch die Codebeispiele dienen dazu, die Prinzipien zu studieren, und nicht dazu, jemanden zu stoßen oder ihn bei etwas zu erwischen....... Was ich frage, bedeutet, dass es nicht klar ist. Schließlich MÜSSEN Sie theoretisch verstehen, was und wie. Und dann erschaffen, formen, erfinden........

 
Können Sie mir sagen, ob es möglich ist, ein jpeg in einem Diagramm auszugeben?
 
keekkenen 25.02.2009 11:34 1) Bitte erklären Sie, OrderSend(...) Funktion hat int-Typ, und Sie definieren es als bool-Typ, während bool-Typ nicht -1 Wert hat, wie korrekt ist es? 2) In KimIV Funktion der Position öffnen Wiederholung durch for(...) gemacht wird, während in Ihrem durch while(...). welche Art und Weise denken Sie, ist besser?
 

1. Dies ist ein Fehler... Sie müssen res als int deklarieren und eine weitere Variable vom Typ bool hinzufügen, um den Wert des Erfolgs/Fehlschlags beim Öffnen der Bestellung zurückzugeben...

2) Ich habe früher auch eine der Implementierungen von Igors OpenPosition()-Funktion verwendet, aber später die Funktion geändert, um Fehler leichter abfangen und melden zu können...

Das Ergebnis ist die folgende Struktur

while ( try != 0){
      // определение условий для открытыия позиции
      //..
     
      // открытие позициц
      res = OrderSend(...);
      
      if ( res > 0){ 
         PlaySound("alert.wav");    
         try = 0;                          
         Comment("Ордер открыт !"); 
         Sleep(2000);       
         ret = true;
      }else{
         /* блок определения ошибок и возврат 
          err - уровень критичности ошибки (0,1,2,3) 
          msg - описание ошибки (если showErrors = true)
          уровни определяются по номеру ошибки
          0-нет ошибки, 1-надо ждать и обновлять,
          2-сделка бракуется,3-фатальная ошибка*/
          
         ErrorBlock( showErrors, err, msg);
         if ( err > 1) try = 0;// в данном случае 2 и 3 критичны
         Comment("Ошибка - ", msg); 
         Sleep(2000);         
      }             
   }  
 
Wenn ich Ihre Funktion richtig verstehe, ist die Anzahl der Versuche im Gegensatz zu Igors Funktion unbegrenzt, wenn es kontinuierliche Requotes gibt? Ist in diesem Fall eine Einschränkung erforderlich?