Thema: Hedge EA
Einzelnen Beitrag anzeigen
  #5 (permalink)  
Alt 09.12.20
MA-EA MA-EA ist offline
Elite Mitglied
 
Registriert seit: Sep 2015
Beiträge: 1.178
MA-EA befindet sich auf einem aufstrebenden Ast
Standard

https://docs.mql4.com/trading/ordercloseby

Scheint bloß mit Ticket zu funktionieren. Und dürfte auch nix bringen, man muss ja so oder so den Spread bezahlen.

Das größte Prob ist wohl die Verbindung. Wenn man 10 oder mehr Symbol() offen hat, und in jedem laufen 10 oder noch mehr Orders gleichzeitig, die immer wieder raus gesucht und berechnet und verwaltet werden müssen, dann ist meine größte Sorge, dass der MT4 und/oder die Verbindung irgendwann nicht mehr hinterher kommen.

Wenn das Gerät funktioniert, dann vermutlich nur mit nem Spread von allerhöchstens 20 und ner Hand voll WP.
Code:
//=============================================================================================================
// P R O P E R T Y
//============================================================================================================*/
//#property strict

// #property strict sorgt anscheinend dafür,
// dass Kommentare im Konfig-Fenster im MT4 sichtbar sind.

#property copyright"LoShDistV3.mq4"
#property copyright"daniel-rudloff@web.de"
//=============================================================================================================
// B E S C H R E I B U N G
//=============================================================================================================
extern string TOY="true  = on / yes";
extern string FON="false = off / no";
//=============================================================================================================
// E I N S T E L L U N G E N
//=============================================================================================================
extern string esMN="Magic Numbers";
extern int MN_FiSel=12;
extern int MN_FiBuy=34;
extern int MN_NeSel=56;
extern int MN_NeBuy=78;
//-----------------------------------------------------------------------------------------------------------*/
extern string OOO1="Open Orders";
extern string OOO2="from/till Hour";
extern string OOO3="(Server Time)";
extern int FromH=5;  // Zum Testen ab 5 Uhr Orders öffnen lassen.
extern int TillH=22; // Zum Testen bis einschließlich 22 Uhr öffnen lassen.
//-----------------------------------------------------------------------------------------------------------*/
extern int Slippage=12345;
//-----------------------------------------------------------------------------------------------------------*/
extern int SL=275; // ?
//-----------------------------------------------------------------------------------------------------------*/
extern int TP=425; // ?
//-----------------------------------------------------------------------------------------------------------*/
extern string esIITCBSMS1="if IsTradeContexBusy()";
extern string esIITCBSMS2="sleep Milli Seconds";
extern int slMS=16; // Zum Testen 16 MS
//-----------------------------------------------------------------------------------------------------------*/
extern string esDOONO1="Dist to OrderOpenPrice()";
extern string esDOONO2="open next Order";
extern int Dist_ONO = 25; // ?
//-----------------------------------------------------------------------------------------------------------*/
extern string esDOCAO1="Dist to OrderOpenPrice()";
extern string esDOCAO2="close all Orders";
extern int Dist_CAO = 65; // Zum Testen 65. Weniger als ... ist wahrscheinlich nicht ausreichend?
//-----------------------------------------------------------------------------------------------------------*/
extern int OrdersNeed_Multi = 2;
//-----------------------------------------------------------------------------------------------------------*/
extern double Lots=0.01;
extern double LotsPlus=0.01; // ?
//=============================================================================================================
// G L O B A L E   D E K L A R A T I O N E N
//=============================================================================================================
bool
fiSH,fiLO,
neSH,neLO,
OCsel,OCbuy
;
//-----------------------------------------------------------------------------------------------------------*/
double
SL_Sel,SL_Buy,TP_Sel,TP_Buy,MSL,
FiSelOOP_DistONO,FiBuyOOP_DistONO,
NeSelOOP_DistONO,NeBuyOOP_DistONO,
FiSelOOP_DistCAO,FiBuyOOP_DistCAO
;
//-----------------------------------------------------------------------------------------------------------*/
int
TI_FiSel,TI_FiBuy,TI_NeSel,TI_NeBuy,
i,j,k,l,m,n,o,p,q,
FL_opSel,FL_neSel,FL_opBuy,FL_neBuy, // Temporäre Opened/Need-Werte, nur für forLoops ( ? )
Opened_Sel,Opened_Buy,
Need_Sel,Need_Buy
;
//=============================================================================================================
// I N I T
//=============================================================================================================
void OnInit(){}
//=============================================================================================================
// D E I N I T ?
//=============================================================================================================
void OnDeinit(const int reason){}// ?
//=============================================================================================================
// E A   F U N K T I O N E N   S T A R T
//=============================================================================================================int 
void OnTick(){
//=============================================================================================================
// S T O P   L O S S
//=============================================================================================================
//SL auf 0 stellen, wenn oben <1,
//um irgendwelche Missverständnisse zu vermeiden.
if(SL<1){
  SL_Sel=0.0;
  SL_Buy=0.0;}
if(SL>=1){
  SL_Sel=NormalizeDouble(Bid+SL*_Point,_Digits);
  SL_Buy=NormalizeDouble(Ask-SL*_Point,_Digits);}
//SL genauso groß wie Minstoplevels machen, wenn er kleiner ist:
MSL=MarketInfo(Symbol(),MODE_STOPLEVEL);
if(SL_Sel<MSL)SL_Sel=MSL;
if(SL_Buy<MSL)SL_Buy=MSL;
//=============================================================================================================
// T A K E   P R O F I T
//=============================================================================================================
//TP auf 0 stellen, wenn oben <1,
//um irgendwelche Missverständnisse zu vermeiden.
if(TP<1){
  TP_Sel=0.0;
  TP_Buy=0.0;}
if(TP>=1){
  TP_Sel=NormalizeDouble(Bid-TP*_Point,_Digits);
  TP_Buy=NormalizeDouble(Ask+TP*_Point,_Digits);}
//=============================================================================================================
// C H E C K   H O U R
//=============================================================================================================
// Prüfen, ob zur Zeit Orders geöffnet werden dürfen.
if(

    (Hour()>=FromH&&Hour()<=TillH)||

    (Hour()> TillH&&Hour()<FromH && Opened_Sel>=1 && Opened_Buy>=1 )
      
  ){

//=============================================================================================================
// 1 . O R D E R   S E A R C H   
//=============================================================================================================// Prüfen, überhaupt Orders offen sind.
fiSH=false;
neSH=false;
fiLO=false;
neLO=false;
for(i=OrdersTotal()-1;i>=0;i--){
if(OrderSelect(i,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_FiSel)fiSH=true;
if(OrderMagicNumber()==MN_NeSel )neSH=true;
if(OrderMagicNumber()==MN_FiBuy)fiLO=true;
if(OrderMagicNumber()==MN_NeBuy )neLO=true;}}}
//=============================================================================================================
// O P E N   F I R S T   S E L L / O P E N   F I R S T   B U Y
//=============================================================================================================// Prüfen, überhaupt Orders offen sind.
// Wenn gar keine Orders offen sind...
if(fiSH==false&&neSH==false&&fiLO==false&&neLO==false){
//-----------------------------------------------------------------------------------------------------------*/
//...Zähler auf 0 setzen.  
  Opened_Sel=0;
  Opened_Buy=0;
  Need_Sel  =0;
  Need_Buy  =0;
//-----------------------------------------------------------------------------------------------------------*/

// ...FirstSell öffnen:
  if(IsTradeAllowed()==true){
    TI_FiSel=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_FiSel,clrBlue);
    if(IsTradeContextBusy()==true)Sleep(slMS);} // ?

// ...FirstBuy öffnen:
  if(IsTradeAllowed()==true){
    TI_FiBuy=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL_Buy,TP_Buy,NULL,MN_FiBuy,clrBlue);
    if(IsTradeContextBusy()==true)Sleep(slMS);} // ?

}
//=============================================================================================================
// 2 . O R D E R   S E A R C H 
//=============================================================================================================
// Prüfen, ob 1.Sell und 1.Buy geöffnet wurden,
// und ob next Sell und next Buy schon geöffnet wurden.
for(j=OrdersTotal()-1;j>=0;j--){
if(OrderSelect(j,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_FiSel)fiSH=true;
if(OrderMagicNumber()==MN_NeSel)neSH=true;
if(OrderMagicNumber()==MN_FiBuy)fiLO=true;
if(OrderMagicNumber()==MN_NeBuy)neLO=true;}}}
//=============================================================================================================
// O P E N   F I R S T   N E X T   O R D E R S
//=============================================================================================================
// Wenn nur FirstSell und FirstBuy offen sind,
// bei entsprechenden Bedingungen
// next Sel / next Buy öffnen.
if(fiSH==true&&fiLO==true&&neSH==false&&neLO==false){
//-----------------------------------------------------------------------------------------------------------*/

// Wenn FirstSell Bedingungen erfüllt, next Sell öffnen.
if(OrderSelect(TI_FiSel,SELECT_BY_TICKET)){
if(OrderSymbol()==Symbol()){ // ?
      
  FiSelOOP_DistONO=NormalizeDouble( OrderOpenPrice() - Dist_ONO*_Point,_Digits);

  if(Bid <= FiSelOOP_DistONO){

    for( k=OrdersNeed_Multi ; k>0 ; k--){
      if(IsTradeAllowed()==true)TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_NeSel,clrBlue);
      if(IsTradeContextBusy()==true)Sleep(slMS);

      Opened_Sel++;

      Need_Sel = Opened_Sel * OrdersNeed_Multi;

      Need_Buy = Need_Sel * OrdersNeed_Multi;} // ?

} } }

//-----------------------------------------------------------------------------------------------------------*/

// Wenn 1.Buy Bedingungen erfüllt,
// next Buy öffnen.
if(OrderSelect(TI_FiBuy,SELECT_BY_TICKET)){
if(OrderSymbol()==Symbol()){
       
  FiBuyOOP_DistONO=NormalizeDouble( OrderOpenPrice() + Dist_ONO*_Point,_Digits);

  if(Ask>=FiBuyOOP_DistONO){

    for( l=OrdersNeed_Multi ; l>0 ; l--){
      if(IsTradeAllowed()==true)TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots,Bid,Slippage,SL_Buy,TP_Buy,NULL,MN_NeBuy,clrBlue);
      if(IsTradeContextBusy()==true)Sleep(slMS);
          
        Opened_Buy++;
      
        Need_Buy = Opened_Buy * OrdersNeed_Multi;
          
        Need_Sel = Need_Buy * OrdersNeed_Multi;}

} } }
//-----------------------------------------------------------------------------------------------------------*/
}
//=============================================================================================================
// 3 . O R D E R   S E A R C H 
//=============================================================================================================
// 1.Sell und 1.Buy müssen offen sein.
// nextSell und/oder nextBuy müssen offen sein.
for(m=OrdersTotal()-1;m>=0;m--){
if(OrderSelect(m,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_FiSel)fiSH=true;
if(OrderMagicNumber()==MN_NeSel)neSH=true;
if(OrderMagicNumber()==MN_FiBuy)fiLO=true;
if(OrderMagicNumber()==MN_NeBuy)neLO=true;}}}
//=============================================================================================================
// C H E C K   F I R S T   O R D E R S   A N D   N E X T   O R D E R S
//=============================================================================================================
// Wenn FirstSell und FirstBuy offen sind...
if(fiSH==true&&fiLO==true){

// ...und nextSell oder nextBuy offen sind,
  if(neSH==true||neLO==true){

// Weitere nextOrders öffnen,
// wenn Bedingungen erfüllt sind.
//=============================================================================================================
// C H E C K   F I R S T   A N D   N E X T   S E L L   O R D E R S
//=============================================================================================================// Letzten next Sell über Ticket auswählen.     

// Letzten NextSell auswählen.
if(OrderSelect(TI_NeSel,SELECT_BY_TICKET)){if(OrderSymbol()==Symbol()){


//Prüfen, ob letzter NextSell OpenNextOrder-Dist erreicht hat.
  NeSelOOP_DistONO=NormalizeDouble( OrderOpenPrice() - Dist_ONO*_Point,_Digits );
  if(Bid <= NeSelOOP_DistONO){

//    Wenn ja, FirstSell über Ticket auswählen.
  if(OrderSelect(TI_FiSel,SELECT_BY_TICKET)){if(OrderSymbol()==Symbol()){
    
//=============================================================================================================
// O P E N   N E W   S E L L   O R D E R S   B Y   D I S T
//=============================================================================================================

//        Wenn FirstSell Gewinn-Distanz nicht erreicht hat, weitere Sell-Orders öffnen.
          if( Ask > FiSelOOP_DistCAO ){

            FL_opSel=Opened_Sel; // ?
            FL_neSel=Need_Sel;  // ?
            for( n=FL_neSel ; n>0 ; n--){
              if(IsTradeAllowed()==true)TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_NeSel,clrYellow);
              if(IsTradeContextBusy()==true)Sleep(slMS);

              Opened_Sel++;

              Need_Sel = Opened_Sel * OrdersNeed_Multi;

              Need_Buy = Need_Sel * OrdersNeed_Multi;} }

//=============================================================================================================
// C L O S E   A L L   O R D E R S   B Y   S E L L   D I S T
//=============================================================================================================

//        Wenn FirstSell Gewinn-Dist doch erreicht hat... 
          if( Ask <= FiSelOOP_DistCAO ){
          
//          ...Lots erhöhen...
            Lots = OrderLots() + LotsPlus; // ?

//          ...und alle Orders schließen.
            for(p=OrdersTotal()-1;p>=0;p--){
            if(OrderSelect(p,SELECT_BY_POS)){
            if(OrderSymbol()==Symbol()){

              if(OrderMagicNumber()==MN_NeBuy||OrderMagicNumber()==MN_FiBuy||OrderMagicNumber()==MN_NeSel||OrderMagicNumber()==MN_FiSel){
                if(IsTradeAllowed()==true)OCbuy=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
                if(IsTradeContextBusy()==true)Sleep(slMS);}

} } } }
//-----------------------------------------------------------------------------------------------------------*/
} } } } }
//=============================================================================================================
// C H E C K   F I R S T   A N D   N E X T   B U Y   O R D E R S
//=============================================================================================================

// Letzten NextBuy über Ticket auswählen.
if(OrderSelect(TI_NeBuy,SELECT_BY_TICKET)){
  if(OrderSymbol()==Symbol()){

//  Prüfen, ob NextBuy OpenNextOrder-Dist erreicht hat.
    NeBuyOOP_DistONO=NormalizeDouble(OrderOpenPrice() + Dist_ONO*_Point,_Digits);
    if(Ask >= NeBuyOOP_DistONO){

//    Wenn ja, FirstBuy über Ticket auswählen.
      if(OrderSelect(TI_FiBuy,SELECT_BY_TICKET)){
        if(OrderSymbol()==Symbol()){

//        Prüfen, ob 1.Buy Gewinn-Distanz erreicht hat.   
          FiBuyOOP_DistCAO=NormalizeDouble( OrderOpenPrice() + Dist_CAO*_Point,_Digits);
//=============================================================================================================
// O P E N   N E W   B U Y   O R D E R S   B Y   D I S T
//=============================================================================================================

// Wenn 1.Buy Gewinn-Distanz nicht erreicht hat weitere Buy-Orders öffnen.       
            if(Bid < FiBuyOOP_DistCAO){

              FL_opBuy=Opened_Buy; // ?
              FL_neBuy=Need_Buy;  // ?
              for( o=FL_neBuy ; o>0 ; o--){
                if(IsTradeAllowed()==true)TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots,Bid,Slippage,SL_Buy,TP_Buy,NULL,MN_NeBuy,clrYellow);
                if(IsTradeContextBusy()==true)Sleep(slMS);
          
                Opened_Buy++;
      
                Need_Buy = Opened_Buy * OrdersNeed_Multi;
          
                Need_Sel = Need_Buy * OrdersNeed_Multi;} }

//=============================================================================================================
// C L O S E   A L L   O R D E R S   B Y   B U Y   D I S T
//=============================================================================================================

//        Wenn FirstBuy Gewinn-Dist doch erreicht hat...
          if( Bid >= FiBuyOOP_DistCAO ){
          
//          ...Lots erhöhen...
            Lots = OrderLots() + LotsPlus; // ?

//          ...und alle Orders schließen.
            for(q=OrdersTotal()-1;q>=0;q--){
            if(OrderSelect(q,SELECT_BY_POS)){
            if(OrderSymbol()==Symbol()){

              if(OrderMagicNumber()==MN_NeSel||OrderMagicNumber()==MN_FiSel||OrderMagicNumber()==MN_NeBuy||OrderMagicNumber()==MN_FiBuy){
                if(IsTradeAllowed()==true)OCsel=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
                if(IsTradeContextBusy()==true)Sleep(slMS);}

} } } }
//-----------------------------------------------------------------------------------------------------------*/
} } } } }
//-----------------------------------------------------------------------------------------------------------*/
} }
//-----------------------------------------------------------------------------------------------------------*/
} // Öffnende Klammer nach Hour Check
//=============================================================================================================
// E A   F U N K T I O N E N   B E E N D E N
//=============================================================================================================
}//(void OnTick)
Angehängte Dateien
Dateityp: mq4 LoShDistV3.mq4 (36,4 KB, 1x aufgerufen)