Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Mehrere EAs auf einem Konto (http://www.expert-advisor.com/forum/showthread.php?t=5747)

McMenneman 11.07.17 18:23

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

traderdoc 11.07.17 20:51

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

next user 11.07.17 21:19

Zitat:

Zitat von McMenneman (Beitrag 39135)
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;
  }
}


McMenneman 12.07.17 13:54

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!?

next user 12.07.17 14:37

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.

McMenneman 12.07.17 15:34

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!???

next user 12.07.17 15:54

Zitat:

Zitat von McMenneman (Beitrag 39148)
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 39148)
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 39148)
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.

McMenneman 12.07.17 16:48

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


next user 12.07.17 17:12

Zitat:

Zitat von McMenneman (Beitrag 39150)
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.

McMenneman 12.07.17 17:36

Funktioniert soweit erst mal Prima!

Danke dafür...

Nächste Frage kommt bestimmt...so long....nice trades!


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

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum