Thema: Hedge EA
Einzelnen Beitrag anzeigen
  #18 (permalink)  
Alt 24.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

Er ist ja eigentlich nicht fehlerhaft. Gibt keine Fehlermeldungen oder Warnungen und tut, soweit ich gesehn habe, was er soll. Vermutlich kann man das ein oder andere besser machen, aber er funktioniert.

Das einzige "Problem" ist ( hoffe ich jedenfalls ) , genau zu berechnen wann er weitere Orders öffnen oder Alle schließen soll. Die Berechnungen / Bedingungen dafür kommen sich gern mal in die Quere. Da hatte ich auf Tipps / Hinweise gehofft.
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=15; // Zum Testen bis einschließlich 15 Uhr öffnen lassen.
//-----------------------------------------------------------------------------------------------------------*/
extern int Slippage=12345;
//-----------------------------------------------------------------------------------------------------------*/
extern int SL=425; // ?
//-----------------------------------------------------------------------------------------------------------*/
extern int TP=275; // ?
//-----------------------------------------------------------------------------------------------------------*/
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 = 12; // ?
//-----------------------------------------------------------------------------------------------------------*/
extern string esDOCAO1="Dist to OrderOpenPrice()";
extern string esDOCAO2="close all Orders";
extern int Dist_CAO = 32; // Zum Testen 32. Weniger als ca. 24 ist wahrscheinlich nicht ausreichend?
//-----------------------------------------------------------------------------------------------------------*/
extern int OrdersNeed_Multi = 2; //
//-----------------------------------------------------------------------------------------------------------*/
extern double Lots=0.01;
extern double LotsPlus=0.0; // ?
//=============================================================================================================
// 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_DONO,NeBuyOOP_DONO,
FiSelOOP_DCAO,FiBuyOOP_DCAO
;
//-----------------------------------------------------------------------------------------------------------*/
int
TI_FiSel,TI_FiBuy,TI_NeSel,TI_NeBuy,
i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,
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);}
//=============================================================================================================
// 1 . O R D E R   S E A R C H   
//=============================================================================================================
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;}}}
//=============================================================================================================
// C H E C K   H O U R
//=============================================================================================================
// Prüfen, ob Orders geöffnet werden dürfen.
if(

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

|| ( Hour()< FromH && fiSH==true && fiLO==true )

|| ( Hour()> TillH && fiSH==true && fiLO==true )

  ){ // Schließende Klammer ...
//=============================================================================================================
// 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){
//...FirstSell öffnen:
  if(IsTradeAllowed()==true){
    TI_FiSel=OrderSend(Symbol(),OP_SELL,Lots,NULL,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,NULL,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 FirstSell und FirstBuy geöffnet wurden,
// und ob NextSell und NextBuy 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...
if(fiSH==true&&fiLO==true&&neSH==false&&neLO==false){
//...alle Zähler auf 0 setzen...  
Opened_Sel=0;
Opened_Buy=0;
Need_Sel  =0;
Need_Buy  =0;
//-----------------------------------------------------------------------------------------------------------*/
// ...und bei entsprechenden Bedingungen next-Sel/next-Buy öffnen.

// FirstSell raus suchen:
if(OrderSelect(TI_FiSel,SELECT_BY_TICKET)){

//Wenn FirstSell Bedingungen erfüllt, next Sell öffnen.
  FiSelOOP_DistONO=NormalizeDouble( OrderOpenPrice() - Dist_ONO *_Point,_Digits);
  if( Bid <= FiSelOOP_DistONO ){

    for( l=OrdersNeed_Multi ; l>=1 ; l--){
      if(IsTradeAllowed()==true)TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots,NULL,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;} } // ?
}
//-----------------------------------------------------------------------------------------------------------*/
// FirstBuy auswählen...
if(OrderSelect(TI_FiBuy,SELECT_BY_TICKET)){

//Wenn FirstBuy Bedingungen erfüllt,next Buy öffnen.       
  FiBuyOOP_DistONO=NormalizeDouble( OrderOpenPrice() + Dist_ONO *_Point,_Digits);
  if( Ask >= FiBuyOOP_DistONO ){

    for( m=OrdersNeed_Multi ; m>=1 ; m--){
      if(IsTradeAllowed()==true)TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots,NULL,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 
//=============================================================================================================
// FirstSell und FirstBuy müssen offen sein.
// NextSell und/oder NextBuy müssen offen sein.
for(n=OrdersTotal()-1;n>=0;n--){
if(OrderSelect(n,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 FirstSel   u n d   FirstBuy offen sind...
if(fiSH==true&&fiLO==true){
//...wenn NextSell   u n d / o d e r   NextBuy offen sind...
  if(neSH==true||neLO==true){
//=============================================================================================================
// 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 NextSell raussuchen:
if(OrderSelect(TI_NeSel,SELECT_BY_TICKET)){

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

//  Wenn ja, FirstSell raussuchen.
    if(OrderSelect(TI_FiSel,SELECT_BY_TICKET)){
    if(OrderSymbol()==Symbol()){
    
//    Wenn FirstSell Gewinn-Distanz nicht erreicht hat... 
      FiSelOOP_DCAO = NormalizeDouble( OrderOpenPrice() - Dist_CAO *_Point,_Digits);
      if( Ask > FiSelOOP_DCAO ){

//      ...weitere Sell_Orders öffnen.
        for( l=Need_Sel ; l>=1 ; l--){
          if(IsTradeAllowed()==true)TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots,NULL,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;} }// ?
} } } }
//=============================================================================================================
// 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 raus suchen:
if(OrderSelect(TI_NeBuy,SELECT_BY_TICKET)){

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

//  Wenn ja, FirstBuy raus suchen.
    if(OrderSelect(TI_FiBuy,SELECT_BY_TICKET)){
    if(OrderSymbol()==Symbol()){

//    Prüfen, ob FirstBuy Gewinn-Distanz erreicht hat.   
      FiBuyOOP_DCAO=NormalizeDouble( OrderOpenPrice() + Dist_CAO *_Point,_Digits);

//    Wenn FirstBuy Gewinn-Distanz nicht erreicht hat...       
      if( Bid < FiBuyOOP_DCAO ){
      
//      weitere Buy-Orders öffnen. 
        for( s=Need_Buy ; s>=1 ; s--){
          if(IsTradeAllowed()==true)TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots,NULL,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;} }
} } } }
//-----------------------------------------------------------------------------------------------------------*/
} }
//=============================================================================================================
// C L O S E   A L L   O R D E R S   B Y   S E L L   D I S T
//=============================================================================================================
// FirstSell raus suchen.
if(OrderSelect(TI_FiSel,SELECT_BY_TICKET)){

//Wenn FirstSell Gewinn-Dist erreicht hat...
  FiSelOOP_DCAO = NormalizeDouble( OrderOpenPrice() - Dist_CAO *_Point,_Digits);
  if( Ask < FiSelOOP_DCAO ){

//  ...Lots erhöhen...
    Lots = OrderLots() + LotsPlus; // ?

//  ...und alle Orders schließen.
    for(u=OrdersTotal()-1;u>=0;u--){
    if(OrderSelect(u,SELECT_BY_POS)){
    if(OrderSymbol()==Symbol()){
      if(OrderMagicNumber()==MN_FiBuy){
        if(IsTradeAllowed()==true)OCbuy=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed);
        if(IsTradeContextBusy()==true)Sleep(slMS);}
      if(OrderMagicNumber()==MN_NeBuy){
        if(IsTradeAllowed()==true)OCbuy=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed);
        if(IsTradeContextBusy()==true)Sleep(slMS);}
      if(OrderMagicNumber()==MN_FiSel){
        if(IsTradeAllowed()==true)OCsel=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed);
        if(IsTradeContextBusy()==true)Sleep(slMS);}
      if(OrderMagicNumber()==MN_NeSel){
        if(IsTradeAllowed()==true)OCsel=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed);
        if(IsTradeContextBusy()==true)Sleep(slMS);}
    } } }
//-----------------------------------------------------------------------------------------------------------*/
} }
//=============================================================================================================
// C L O S E   A L L   O R D E R S   B Y   B U Y   D I S T
//=============================================================================================================
//FirstBuy raus suchen.
if(OrderSelect(TI_FiBuy,SELECT_BY_TICKET)){

//Wenn FirstBuy Gewinn-Dist erreicht hat...
  FiBuyOOP_DCAO = NormalizeDouble( OrderOpenPrice() + Dist_CAO *_Point,_Digits);
  if( Bid > FiBuyOOP_DCAO ){
          
//...Lots erhöhen...
    Lots = OrderLots() + LotsPlus; // ?

//...und alle Orders schließen.
    for(w=OrdersTotal()-1;w>=0;w--){
    if(OrderSelect(w,SELECT_BY_POS)){
    if(OrderSymbol()==Symbol()){
      if(OrderMagicNumber()==MN_FiSel){
        if(IsTradeAllowed()==true)OCsel=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed);
        if(IsTradeContextBusy()==true)Sleep(slMS);}
      if(OrderMagicNumber()==MN_NeSel){
        if(IsTradeAllowed()==true)OCsel=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed);
        if(IsTradeContextBusy()==true)Sleep(slMS);}
      if(OrderMagicNumber()==MN_FiBuy){
        if(IsTradeAllowed()==true)OCbuy=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed);
        if(IsTradeContextBusy()==true)Sleep(slMS);}
      if(OrderMagicNumber()==MN_NeBuy){
        if(IsTradeAllowed()==true)OCbuy=OrderClose(OrderTicket(),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)