Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.


Portalsuche


Werbung

Login
Benutzername:
Kennwort:


Statistik
Themen: 3774
Beiträge: 37294
Benutzer: 5.958
Aktive Benutzer: 505
Links: 80
Wir begrüßen unseren neuesten Benutzer: Alf0809
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 17:12).
Neue Benutzer:
vor 22 Stunden
- Alf0809
vor einem Tag
- jimydirekt...
vor einem Tag
- Geri78
vor 2 Tagen
- Phil7
vor 2 Tagen
- daijiro051...

Onlineuser
'Wer ist online' anzeigen Benutzer: 1
Gäste: 44
Gesamt: 45
Team: 0
Team:  
Benutzer:  fxnoob
Freunde anzeigen

Empfehlungen

Werbung

Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 11.07.17
Neues Mitglied
 
Registriert seit: Jul 2017
Beiträge: 10
McMenneman befindet sich auf einem aufstrebenden Ast
Standard Mehrere EAs auf einem Konto

Moin Zusammen,
also folgende Fragestellung:
Ich trade zb. 3 versch. EAs auf einem Konto. Jeder EA darf/soll max. 1 Order eröffnen können. Dafür habe ich bei allen jeweils eine Abfrage Orderlots()<1 eingebaut.
Wie ich das jetzt im Trading sehe, heisst das ja im Endeffekt, wer zuerst kommt malt zuerst - also EA1 eröffnet eine Position und damit sind EA2-3 blockiert bis diese Position geschlossen wird.
Meine Idee wäre das mit der Abfrage nach der MagicNum oder einem Comment oder so zu umgehen...
Ist das so richtig gedacht? Und wie löst bzw. habt ihr solche Probleme behoben?

Oder gibt es dazu schon einen Thread?

Gruss
Mit Zitat antworten
  #2 (permalink)  
Alt 11.07.17
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.848
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Bereits mehrmals gepostet:

Code:
void CheckOrders() {
   BuyOrder = false; SellOrder = false;
   for (int i = OrdersTotal()-1; i >= 0; i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
            if (OrderType() == OP_BUY)  BuyOrder = true;
            if (OrderType() == OP_SELL) SellOrder = true;
         }
      }
   }
}
Und dann wird BuyOrder bzw. SellOrder ausgewertet, ob true oder false.

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
Mit Zitat antworten
  #3 (permalink)  
Alt 11.07.17
Mitglied
 
Registriert seit: May 2015
Beiträge: 250
next user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von McMenneman Beitrag anzeigen
Orderlots()<1
Sollte wohl OrdersTotal() heißen.
Du könntest das von Traderdoc gepostete verwenden. Wenn du allerdings einfach nur umgehen willst, das EA2-3 blockiert werden, so darfst du halt nicht
abfragen, ob OrdersTotal()<1 ist, sondern fragst einfach ab, ob es schon eine Order vom entsprechenden EA gibt (MagicN.).
Code:
bool orderset = false;
for(int i=OrdersTotal()-1; i>=0; i--)
{
   if(OrderSelect(i,SELECT_BY_POS))
   {
      if(OrderMagicNumber() == DEINE_MAGIC_NUMBER)
         orderset = true;
   }
}
Mit Zitat antworten
  #4 (permalink)  
Alt 12.07.17
Neues Mitglied
 
Registriert seit: Jul 2017
Beiträge: 10
McMenneman befindet sich auf einem aufstrebenden Ast
Red face

Schaut mal was ich da jetzt gebaut habe...
läuft auf den DAX_1min
1) EA soll eine Stoporder platzieren und zwar pro neuer Minute/Candle eine neue, respektive im aktuellen Fall zb. auf das High[1]+6
2) wurde Stop nicht getriggert soll er nach 1min/Candle gestrichen werden
3) Insgesamt soll es so sein das bestehende Orders im Account zb. diskritionäre oder durch andere EAs nicht beachtet werden.

PHP-Code:
int OrderNumber;
int BarsSinceEntry;

bool IsNewCandle()
{
   static 
int BarsOnChart=0// static Var. wird nur ein mal gesetzt und ist nur in der Function sichtbar = Local Variable
   
if(Bars == BarsOnChart)
   return(
false);
   
BarsOnChart Bars;
   return(
true);
}

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
 
//---
   
return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
 
//Überprüfung ob neue Candle vorliegt 
  
if(IsNewCandle()){

//check bzgl Order des EAs
  
bool orderset false;
   for(
int i=OrdersTotal()-1i>=0i--)
   {
   if(
OrderSelect(i,SELECT_BY_POS))
   {
      if(
OrderMagicNumber() == 202 )
         
orderset true;
   }
 }

//simple Test Order die einfach platziert bei Neuer Candle platziert werden soll => und Streichung der vorherigen StopOrder
   
if(orderset=true)
   {
      if (
0<1//Bedingung Hauptsache es geht die Order raus
      
{
         
OrderNumber OrderSend(Symbol(), OP_BUYSTOP,0.1,High[1]+65,125000,"Test",202,TimeCurrent()+660,Blue);
         
BarsSinceEntry=TimeCurrent();
      }
   }


//pending Orders streichen         
 
if (BarsSinceEntry && TimeCurrent() > BarsSinceEntry PeriodSeconds(PERIOD_CURRENT)) {
   for (
int i OrdersTotal()-1>= 0i--) {
      if (
OrderSelect(iSELECT_BY_POSMODE_TRADES)) {
         if (
OrderSymbol() == Symbol() && OrderMagicNumber() == 202) {
            if (
OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP) {
               
bool res OrderDelete(OrderTicket());
               if (
resBarsSinceEntry 0;
               break;
               Print(
GetLastError());
            }
         }
      }
   }
}   
         

 
         } 
  
}
//+------------------------------------------------------------------+ 
Wenn ich es so mache platziert der EA "ca."? jede neue Minute eine neue StpOrder , streicht aber die vorherige nicht.

Wie gesagt, bin noch ganz am Anfang...was mache ich falsch!?
Mit Zitat antworten
  #5 (permalink)  
Alt 12.07.17
Mitglied
 
Registriert seit: May 2015
Beiträge: 250
next user befindet sich auf einem aufstrebenden Ast
Standard

Code:
//simple Test Order die einfach platziert bei Neuer Candle platziert werden soll => und Streichung der vorherigen StopOrder
if(orderset=true)
{
   if (0<1) //Bedingung Hauptsache es geht die Order raus
   {
      OrderNumber = OrderSend(Symbol(), OP_BUYSTOP,0.1,High[1]+6, 5,12500, 0,"Test",202,TimeCurrent()+660,Blue);
      BarsSinceEntry=TimeCurrent();
   }
}
1. Oben musst du 2 Gleichheitszeichen setzen (orderset == true), oder einfach (orderset). So wie du es hast, weist du der Variablen den Wert "true" zu.
2. Erst willst du pro EA nur eine Order und jetzt setzt du immer eine neue, wenn orderset == true, also wenn schon eine Order von diesem EA vorhanden ist?
3. Die zweite If-Bedingung ist sinnlos. Wieso hast du sie drinne?
4. Wenn du als Preis den Höchstkurs mit 6 addierst, kann es nicht vernünftig werden. Rate mal was passiert, wenn du zu einer Gleitpunktzahl 6 addierst (z.B. 1.12345 + 6).

Code:
if (BarsSinceEntry > 0 && TimeCurrent() > BarsSinceEntry + PeriodSeconds(PERIOD_CURRENT))
Übersetztes, freies Beispiel:
1000 > 0 && 1060 > 1060
Na, wo liegt der Fehler? Warum 1060 > 1060? Weil du in der if davor (if(orderset=true)) immer BarsSinceEntry auf TimeCurrent() setzt.
Sofern zwischen diesen beiden Codeblöcken nicht mindestens 1 Sekunde vergangen ist, so ist TimeCurrent() nie größer als BarsSinceEntry.
Außerdem erübrigt sich an paar Stellen auch eine Abfrage, weil du in den ganzen Codeblock ja erst mit der nächsten Kerze kommst.

Code:
bool res = OrderDelete(OrderTicket());
if (res) BarsSinceEntry = 0;
break;
Print(GetLastError());
GetLastError() wird hier nie aufgerufen, da du jedesmal vorher mit break abbrichst.

Geändert von next user (12.07.17 um 14:52 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 12.07.17
Neues Mitglied
 
Registriert seit: Jul 2017
Beiträge: 10
McMenneman befindet sich auf einem aufstrebenden Ast
Standard

Danke next user!

Der EA soll erst mal auf den DAX laufen - kein Forex. Daher passt das schon mit dem Punkten. Aber sicherlich ist es sauberer auch hier auf Ticks/Pips umzustellen.

Verstehe ich das richtig, das wenn hier:
PHP-Code:
//simple Test Order die einfach platziert bei Neuer Candle platziert werden soll => und Streichung der vorherigen StopOrder
   
if(orderset==true)
   {        
         
OrderNumber OrderSend(Symbol(), OP_BUYSTOP,0.1,High[1]+65,125400,"Test",202,TimeCurrent()+660,Blue);
         
BarsSinceEntry=TimeCurrent();     
   } 
orderset == true steht, das DANN, bei keine Trades erfolgen!

orderset == false steht, das Dann immer Trades geschickt werden, egal ob schon Orders von anderen EAs gefilled wurden und pending sind!? Korrekt???


Bzgl. des Orderstreichens über BarsSinceEntry wie ich es habe klappt aber super!???
Mit Zitat antworten
  #7 (permalink)  
Alt 12.07.17
Mitglied
 
Registriert seit: May 2015
Beiträge: 250
next user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von McMenneman Beitrag anzeigen
Der EA soll erst mal auf den DAX laufen - kein Forex. Daher passt das schon mit dem Punkten.
Gut, ich sehe Code immer erst im "Allgemeinen" an, daher der Hinweis.
Zitat:
Zitat von McMenneman Beitrag anzeigen
orderset == true steht, das DANN, bei keine Trades erfolgen!

orderset == false steht, das Dann immer Trades geschickt werden, egal ob schon Orders von anderen EAs gefilled wurden und pending sind!? Korrekt???
Nein. Wenn orderset == true, so gibt es schon eine Order. Bei deiner if-Abfrage erstellst du aber eine neue Order, wenn orderset == true.
Bei orderset == false werden keine neuen Orders gesetzt.
Zitat:
Zitat von McMenneman Beitrag anzeigen
Bzgl. des Orderstreichens über BarsSinceEntry wie ich es habe klappt aber super!???
Du hast doch eben gesagt, das er die Order nicht löscht.

Muss kurz weg. Bin in'ner Stunde wieder da.
Mit Zitat antworten
  #8 (permalink)  
Alt 12.07.17
Neues Mitglied
 
Registriert seit: Jul 2017
Beiträge: 10
McMenneman befindet sich auf einem aufstrebenden Ast
Standard

Also ich habe es live neben dran laufen!
Nur wenn ich es so eingebe, laufen mit zwei EAs trades!
Mit ==false , jeweils in jedem EA

PHP-Code:
void OnTick()
  {
 
//Überprüfung ob neue Candle vorliegt 
  
if(IsNewCandle()){

//check bzgl Order des EAs
  
bool orderset false;
   for(
int i=OrdersTotal()-1i>=0i--)
   {
   if(
OrderSelect(i,SELECT_BY_POS))
   {
      if(
OrderMagicNumber() == 333 )
         
orderset true;
   }
 }

//simple Test Order die einfach platziert bei Neuer Candle platziert werden soll => und Streichung der vorherigen StopOrder
   
if(orderset==false)
   {        
         
OrderNumber OrderSend(Symbol(), OP_BUYSTOP,0.1,High[1]+65,125400,"Tester",333,TimeCurrent()+660,Blue);
         Print(
GetLastError());
         
BarsSinceEntry=TimeCurrent();     
   } 
Mit Zitat antworten
  #9 (permalink)  
Alt 12.07.17
Mitglied
 
Registriert seit: May 2015
Beiträge: 250
next user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von McMenneman Beitrag anzeigen
Also ich habe es live neben dran laufen!
Nur wenn ich es so eingebe, laufen mit zwei EAs trades!
Mit ==false , jeweils in jedem EA
Ja, so ist es ja auch gedacht. Dein vorheriger Code:
Code:
bool orderset = false;

for(int i=OrdersTotal()-1; i>=0; i--)
{
   if(OrderSelect(i,SELECT_BY_POS))
   {
      if(OrderMagicNumber() == 202 )
         orderset = true;
   }
}

//simple Test Order die einfach platziert bei Neuer Candle platziert werden soll => und Streichung der vorherigen StopOrder
if(orderset=true)
{
   if (0<1) //Bedingung Hauptsache es geht die Order raus
   {
      OrderNumber = OrderSend(Symbol(), OP_BUYSTOP,0.1,High[1]+6, 5,12500, 0,"Test",202,TimeCurrent()+660,Blue);
      BarsSinceEntry=TimeCurrent();
   }
}
In der Orderabfrage stellst du orderset auf tru, wenn bereits eine Order vom EA vorhanden ist.
Im nächsten Teil fragst du aber ab, ob orderset == true ist und eröffnest in dem Fall eine weitere Order.
Bei dem, was du bisher geschrieben hast, soll eine Order ja nur gesetzt werden, wenn noch keine vom EA vorhanden ist.
In dem Fall musst du abfragen, ob orderset == false.
Mit Zitat antworten
  #10 (permalink)  
Alt 12.07.17
Neues Mitglied
 
Registriert seit: Jul 2017
Beiträge: 10
McMenneman befindet sich auf einem aufstrebenden Ast
Smile

Funktioniert soweit erst mal Prima!

Danke dafür...

Nächste Frage kommt bestimmt...so long....nice trades!
Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
ea, expert advisor, mehrere ea, mehrere expert advisor, mql4, programmierung, programmierung metatrader, programmierung mql4


Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +2. Es ist jetzt 08:47 Uhr.



-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2017 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2017 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------