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)
-   -   Custom Indicator EA (http://www.expert-advisor.com/forum/showthread.php?t=6884)

MA-EA 12.01.21 09:11

Custom Indicator EA
 
Liste der Anhänge anzeigen (Anzahl: 4)
Hallo.

Probiere seit einiger Zeit einen EA mit 3 (zum Teil :rolleyes: ) selbst gemachten Indikatoren. Der hat bisher immer nur Buy-Orders geöffnet, obwohl es doch eigentlich wenigstens ein paar Chancen für Sell-Orders geben müsste. Hab den Code immer wieder durch geguckt und hab keine Ahnung, warum er nicht auch Sell-Orders öffnet. :confused: Fehlermeldungen oder Warnungen gibts Keine. Weder beim Kompilieren noch im MT4.

Im Anhang der EA und die 3 Indis. Braucht man nur in den Indikator-Ordner kopieren/speichern und Kompilieren. Dass der EA in den EA-Ordner kompiliert werden muss, brauch ich wohl nicht extra erklären. :rolleyes:
Code:

Eigene Indikatoren:

-OnePrice

-Price+MAd2

-First MA+MAd2

-Second MA+MAd2

//-------------------------------------------------------------------------------------------------------------

//=============================================================================================================
// 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"EIMT4EA_oPRPpMd2MpMd2.mq4"
#property copyright"daniel-rudloff@web.de"
//=============================================================================================================
// B E S C H R E I B U N G
//=============================================================================================================
extern string esTOY="true  = on / yes";
extern string esFON="false = off / no";

extern string esB01="Send Sell/Buy if:";
extern string esB02="first_OnePr";
extern string esB03=">=/<=";
extern string esB04="PRpMAd2_Price";
extern string esB05=">=/<=";
extern string esB06="first MAplMAd2";
extern string esB07=">=/<=";
extern string esB08="secon MAplMAd2";
//=============================================================================================================
// E I N S T E L L U N G E N
//=============================================================================================================
extern string esOOT="Open Orders";
input bool open_Sel=true;
input bool open_Buy=true;
//-----------------------------------------------------------------------------------------------------------*/
extern string esMN="Magic Numbers";
extern int MN_Sel=12;
extern int MN_Buy=34;
//-----------------------------------------------------------------------------------------------------------*/
extern string OOO1="Open Orders";
extern string OOO2="from/till";
extern string OOO3="(Server Time)";
extern int FromH=5; // Zum Testen ab 5 Uhr öffnen
extern int TillH=15;
//-----------------------------------------------------------------------------------------------------------*/
extern string CAOTOC1="Close all Orders at";
extern string CAOTOC2="(Server Time)";
extern bool CAOA=true;
extern int CloseH=17;
//-----------------------------------------------------------------------------------------------------------*/
extern int Slippage=12345; // ?
//-----------------------------------------------------------------------------------------------------------*/
extern string esIITCBSMS1="if IsTradeContexBusy";
extern string esIITCBSMS2="sleep Milli Seconds";
extern int Sl_MS=16;
//-----------------------------------------------------------------------------------------------------------*/
extern string esMS="Max Spread";
extern int Max_Spr=65; // Zum Testen 65
//-----------------------------------------------------------------------------------------------------------*/
extern int SL=175; // 175 testen
//-----------------------------------------------------------------------------------------------------------*/
// Bei ActivTrades müssen SL/TP anscheinend mindestens 5 sein
extern string esTS="Trailing Stop !VIELLEICHT ERROR DRIN!";
input bool TrailingStop=true;  // Zum Testen ein.
extern int TrailingStopStep=25; // Zum Testen 25. Bei TSS 6 wurden gar keine Orders geöffnet.
//-----------------------------------------------------------------------------------------------------------*/
extern int TP=2000; // Zum Testen 2000
//-----------------------------------------------------------------------------------------------------------*/
extern double Lots=0.01;
//-----------------------------------------------------------------------------------------------------------*/
extern string ALSZ="Auto Lotsize !ERROR!";
extern bool Percent_of_Balance=false; // Zum Testen aus. Berechnung ist falsch!
extern double Auto_Lotsize_Perc=0.32; // Zum Testen 0,32%
//-----------------------------------------------------------------------------------------------------------*/
extern string esTF="TimeFrame";
input ENUM_TIMEFRAMES TF=15;// Zum Testen M15
//-----------------------------------------------------------------------------------------------------------*/
// Distance Ask/Bid zu OpenPrice0
extern string esDABOP1="Distance Ask/Bid";
extern string esDABOP2="to";
extern string esDABOP3="OpenPrice Bar0";
extern int DistOP=15;// 15 zum Testen
//=============================================================================================================
// G L O B A L E  E I N S T E L L U N G E N  E I G E N E  I N D I

// P R I C E
//=============================================================================================================
extern string esEAP="EA Price One"; // Vielleicht später mehrere Preise nutzen.
input ENUM_APPLIED_PRICE first_OnePr=PRICE_CLOSE;
//=============================================================================================================
// G L O B A L E  E I N S T E L L U N G E N  E I G E N E  I N D I

// ( P R I C E + M A ) D 2
//=============================================================================================================

extern string esPpM21="PRpMAd2_CHA";
extern string esPpM22="( Price...";

input ENUM_APPLIED_PRICE PRpMAd2_Price=PRICE_CLOSE;

extern string esPpM2MA="... + Moving Average ) / 2";

extern int              PRpMAd2_MA_Period=2; // Periode scheint egal zu sein...
input ENUM_MA_METHOD    PRpMAd2_MA_Method=MODE_SMA;
input ENUM_APPLIED_PRICE PRpMAd2_MA_Price =PRICE_CLOSE;

//=============================================================================================================
// G L O B A L E  E I N S T E L L U N G E N  E I G E N E  I N D I

// M A p l MA d 2
//=============================================================================================================

extern string esMpMd2o="first MAplMAd2_CHA";

extern int              fiMpMd2_onePeriod=3;
input ENUM_MA_METHOD    fiMpMd2_oneMethod=MODE_SMA;
input ENUM_APPLIED_PRICE fiMpMd2_onePrice =PRICE_CLOSE;

extern int              fiMpMd2_twoPeriod=6;
input ENUM_MA_METHOD    fiMpMd2_twoMethod=MODE_SMA;
input ENUM_APPLIED_PRICE fiMpMd2_twoPrice =PRICE_CLOSE;

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

extern string esMpMd2t="second MAplMAd2_CHA";

extern int              seMpMd2_onePeriod=4;
input ENUM_MA_METHOD    seMpMd2_oneMethod=MODE_SMA;
input ENUM_APPLIED_PRICE seMpMd2_onePrice =PRICE_CLOSE;

extern int              seMpMd2_twoPeriod=8;
input ENUM_MA_METHOD    seMpMd2_twoMethod=MODE_SMA;
input ENUM_APPLIED_PRICE seMpMd2_twoPrice =PRICE_CLOSE;

//=============================================================================================================
// G L O B A L E  D E K L A R A T I O N E N
//=============================================================================================================
bool
SHLO,
OMsel,OMbuy,
OCsel,OCbuy
;
//-----------------------------------------------------------------------------------------------------------*/
double
SL_Sel,SL_Buy,TP_Sel,TP_Buy,
SPR,
OPZ,OPZD_Sel,OPZD_Buy,
first_onePR,
first_PRpMAd2,
first_MAplMAd2,secon_MAplMAd2
;
//-----------------------------------------------------------------------------------------------------------*/
int
TiSel,TiBuy
;
//=============================================================================================================
// I N I T
//=============================================================================================================
void OnInit(){
  ChartSetSymbolPeriod(0,NULL,TF);}
//=============================================================================================================
// 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 Minstoplevel machen, wenn er kleiner ist:
double 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);}
//=============================================================================================================
// L O T S  ?
//=============================================================================================================
double Min_L=MarketInfo(Symbol(),MODE_MINLOT);
double Max_L=MarketInfo(Symbol(),MODE_MAXLOT);
if(Lots<Min_L)Lots=Min_L;
if(Lots>Max_L)Lots=Max_L;
//=============================================================================================================
// A U T O L O T S  werden falsch berechnet!
//=============================================================================================================
double

MarReq,
AccBal,
oneL_ML,
MarReq_ML,
OnePercAccBal,
Print_Lots,
OnePercAccBal_AutoLotPerc,
OnePercAccBalAutoLotPerc_MREQMinL

;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////

  MarReq=MarketInfo(Symbol(),MODE_MARGINREQUIRED); // nötige Margin für 1 Lot (100.000 Units)
  AccBal=AccountBalance(); // momentaner Kontostand

//  "1 Lot" geteilt durch Mindest-Lot, um später raus zu finden, wie viel Margin für Mindest-Lot gebraucht wird.
    if(Min_L<1.0 )oneL_ML=1.0*Min_L;
    if(Min_L>=1.0)oneL_ML=1.0/Min_L;

// müsste bis hier richtig sein...

//  Margin_für_1_Lot geteilt durch Ergebnis, um raus zu finden, wie viel Margin für Mindest_Lot benötigt wird.
//  z.B.:  €1000,00 / 100 = €10,00
    if(MarReq< 1.0){
      if(oneL_ML< 1.0)MarReq_ML = MarReq * oneL_ML;  // ?
      if(oneL_ML>=1.0)MarReq_ML = MarReq / oneL_ML;} // ?

    if(MarReq>=1.0){
      if(oneL_ML< 1.0)MarReq_ML = MarReq * oneL_ML;  // ?
      if(oneL_ML>=1.0)MarReq_ML = MarReq / oneL_ML;} // ?

//////////////////////////////////////////////////////////////////////////////////////////////////////////////

//  1% vom Kontostand ausrechnen
//  z.B.: €1000,00 / 100% = €10,00
    OnePercAccBal = AccBal / 100.0; // ?

//  1% des Kontostands * Prozent, für die Lots gekauft werden sollen
//  z.B.: €10,00 * 2,5% = €25,00 ?
    if(OnePercAccBal<1.0){
      if(Auto_Lotsize_Perc< 1.0)OnePercAccBal_AutoLotPerc = OnePercAccBal / Auto_Lotsize_Perc;  // ?
      if(Auto_Lotsize_Perc>=1.0)OnePercAccBal_AutoLotPerc = OnePercAccBal * Auto_Lotsize_Perc;} // ?

    if(OnePercAccBal>=1.0){
      if(Auto_Lotsize_Perc< 1.0)OnePercAccBal_AutoLotPerc = OnePercAccBal / Auto_Lotsize_Perc;  // ?
      if(Auto_Lotsize_Perc>=1.0)OnePercAccBal_AutoLotPerc = OnePercAccBal * Auto_Lotsize_Perc;} // ?

//////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 
    OnePercAccBalAutoLotPerc_MREQMinL = OnePercAccBal_AutoLotPerc / MarReq_ML;

//  z.B.: €25,00 * 0.01L = 0.025L (?)

    Print_Lots = OnePercAccBalAutoLotPerc_MREQMinL * Min_L;

//=============================================================================================================
// E A  P R I C E  D E K L A R A T I O N / B E R E C H N U N G
//=============================================================================================================

first_onePR = iCustom(Symbol(),TF,

"OnePrice_CHA"
,
first_OnePr
,
0 // Line Index ?
,
1 // Bar 1
);

//=============================================================================================================
// I N D I K A T O R E N / O S Z I L L A T O R E N  D E K L A R A T I O N E N
//=============================================================================================================
//=============================================================================================================
// I N D I K A T O R E N / O S Z I L L A T O R E N  D E K L A R A T I O N E N

// MA minus MA +/- MA
//=============================================================================================================


/*
double  iCustom(

  string      symbol,          // symbol
 
  int          timeframe,        // timeframe
 
  string      name,            // path/name of the custom indicator compiled program
 
  ...                            // custom indicator input parameters (if necessary)
 
  int          mode,            // line index
 
  int          shift            // shift

);

double  iMA(
  string      symbol,          // symbol
  int          timeframe,        // timeframe
  int          ma_period,        // MA averaging period
  int          ma_shift,        // MA shift
  int          ma_method,        // averaging method
  int          applied_price,    // applied price
  int          shift            // shift
  );
*/

// 1.
first_PRpMAd2 = iCustom(Symbol(),TF,

"PRpMAd2_CHA"
,
PRpMAd2_Price,
PRpMAd2_MA_Period,
0, // MA-Shift
PRpMAd2_MA_Method,
PRpMAd2_MA_Price,
0 // Line Index ?
,
1 // Bar 1
);

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

//
first_MAplMAd2 = iCustom(Symbol(),TF,

"MAplMAd2_CHA"
,
fiMpMd2_onePeriod,
0,// MA-Shift
fiMpMd2_oneMethod,
fiMpMd2_onePrice,
fiMpMd2_twoPeriod,
0,// MA-Shift
fiMpMd2_twoMethod,
fiMpMd2_twoPrice,
0 // Line Index ?
,
1 // Bar 1
);

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

secon_MAplMAd2 = iCustom(Symbol(),TF,

"MAplMAd2_CHA"
,
seMpMd2_onePeriod,
0,// MA-Shift
seMpMd2_oneMethod,
seMpMd2_onePrice,
seMpMd2_twoPeriod,
0,// MA-Shift
seMpMd2_twoMethod,
seMpMd2_twoPrice,
0 // Line Index ?
,
1 // Bar 1
);
//=============================================================================================================
// S P R E A D
//=============================================================================================================
SPR=Ask-Bid;
//=============================================================================================================
// ?
//=============================================================================================================
//=============================================================================================================
// O P  B A R 0    D E K L A R A T I O N / B E R E C H N U N G
//=============================================================================================================

OPZ = iOpen(Symbol(),TF,0);

OPZD_Sel=NormalizeDouble( OPZ - DistOP *_Point,_Digits);
OPZD_Buy=NormalizeDouble( OPZ + DistOP *_Point,_Digits);

//=============================================================================================================
// O R D E R  S E N D 
//=============================================================================================================
if(Hour()>=FromH&&Hour()<=TillH){
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(NormalizeDouble(SPR<=Max_Spr*_Point,_Digits)){
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
SHLO=false;
for(int i=OrdersTotal()-1;i>=0;i--){
if(OrderSelect(i,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_Sel||OrderMagicNumber()==MN_Buy)SHLO=true;}}}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(SHLO==false){
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(open_Sel==true){

  if(

      first_onePR    <= first_PRpMAd2  &&
         
      first_PRpMAd2  <= first_MAplMAd2 &&
         
      first_MAplMAd2 <= secon_MAplMAd2 &&
     
                Bid <= OPZD_Sel
     
    ){
   
        if(IsTradeAllowed()==true)TiSel=OrderSend(Symbol(),OP_SELL,Lots,NULL,Slippage,SL_Sel,TP_Sel,NULL,MN_Sel,clrBlue);
        if(IsTradeContextBusy()==true)Sleep(Sl_MS);
         
        Print("Sended Sell:",

              "-Ask=",Ask,
              "-Bid=",Bid,
              "-Spr=",SPR,
              "-OPZD_Sel=",OPZD_Sel,
              "-OpenPr0=",OPZ,
              "-1.OnePr=",first_onePR,
              "-1.PRpMAd2=",first_PRpMAd2,
              "-1.MAplMAd2=",first_MAplMAd2,
              "-2.MAplMAd2=",secon_MAplMAd2

            );

        Print("AutoLots:",

              "-MarReq=",MarReq,
              "-AccBal=",AccBal,
              "-MinL=",Min_L,
              "-oneL_ML=",oneL_ML,
              "-MarReq_1L=",MarReq,
              "-MarReq_ML=",MarReq_ML,
              "-OnePercAccBal=",OnePercAccBal,
              "-Auto_PrintLots=",Print_Lots

            );

} }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(open_Buy==true){

  if(
         
      first_onePR    >= first_PRpMAd2  &&
         
      first_PRpMAd2  >= first_MAplMAd2 &&
         
      first_MAplMAd2 >= secon_MAplMAd2 &&
     
                Ask >= OPZD_Buy

    ){

      if(IsTradeAllowed()==true)TiBuy=OrderSend(Symbol(),OP_BUY,Lots,NULL,Slippage,SL_Buy,TP_Buy,NULL,MN_Buy,clrBlue);
      if(IsTradeContextBusy()==true)Sleep(Sl_MS);
         
      Print("Sended Buy:",

            "-Ask=",Ask,
            "-Bid=",Bid,
            "-Spr=",SPR,
            "-OPZD_Buy=",OPZD_Buy,
            "-OpenPr1=",OPZ,
            "-1.OnePr=",first_onePR,
            "-1.PRpMAd2=",first_PRpMAd2,
            "-1.MAplMAd2=",first_MAplMAd2,
            "-2.MAplMAd2=",secon_MAplMAd2

            );

      Print("AutoLots:",

            "-MarReq=",MarReq,
            "-AccBal=",AccBal,
            "-MinL=",Min_L,
            "-oneL_ML=",oneL_ML,
            "-MarReq_1L=",MarReq,
            "-MarReq_ML=",MarReq_ML,
            "-OnePercAccBal=",OnePercAccBal,
            "-Auto_PrintLots=",Print_Lots
 
            );

} }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
} } }
//=============================================================================================================
// ? O R D E R  M O D I F Y  ( T R A I L I N G  S T O P ) ?
//=============================================================================================================
if(TrailingStop==true){
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
for(int k=OrdersTotal()-1;k>=0;k--){
if(OrderSelect(k,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Neuer SELL-"SL" (S_TS) Funktionen/Berechnungen
if(OrderMagicNumber()==MN_Sel){

//neuer Sell_SL = alter Sell_SL - TSS
  double TS_Sel = NormalizeDouble( OrderStopLoss() - TrailingStopStep *_Point,_Digits);

//
  double TSSel_SL = NormalizeDouble( TS_Sel - SL *_Point,_Digits);

//Wenn Bid drunter ist, soll neuer Sell-SL gesendet werden.
  if( Bid < TSSel_SL ){
    if(IsTradeAllowed()==true)OMsel=OrderModify(OrderTicket(),OrderOpenPrice(),TS_Sel,OrderTakeProfit(),NULL,clrBlue);
    if(IsTradeContextBusy()==true)Sleep(Sl_MS);} }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Neuer Buy-"SL" (S_TS) Funktionen/Berechnungen
if(OrderMagicNumber()==MN_Buy){

// Alter Buy-SL + TSS = neuer Buy-SL
  double TS_Buy = NormalizeDouble( OrderStopLoss() + TrailingStopStep *_Point,_Digits);

// neuer BUY_"SL" + SL
  double TSBuy_SL = NormalizeDouble( TS_Buy + SL *_Point,_Digits);

  if( Ask > TSBuy_SL ){
    if(IsTradeAllowed()==true)OMbuy=OrderModify(OrderTicket(),OrderOpenPrice(),TS_Buy,OrderTakeProfit(),NULL,clrBlue);
    if(IsTradeContextBusy()==true)Sleep(Sl_MS);} }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
} } } }
//=============================================================================================================
// O R D E R  C L O S E
//=============================================================================================================
for(int l=OrdersTotal()-1;l>=0;l--){
if(OrderSelect(l,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(OrderMagicNumber()==MN_Sel){

  if(

      ( first_onePR  >= first_PRpMAd2  &&
 
        first_PRpMAd2 >= first_MAplMAd2

      )||(CAOA==true&&Hour()>=CloseH)){

      if(IsTradeAllowed()==true)OCsel=OrderClose(NULL,NULL,NULL,Slippage,clrRed);
      if(IsTradeContextBusy()==true)Sleep(Sl_MS);

      Print("Closed Sel:",

            "-Ask=",Ask,
            "-Bid=",Bid,
            "-Spr=",SPR,
            "-1.onePR=",first_onePR,
            "-1.PRpMAd2=",first_PRpMAd2,
            "-1.MAplMAd2=",first_MAplMAd2

          );

} }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(OrderMagicNumber()==MN_Buy){

  if(
         
      ( first_onePR  <= first_PRpMAd2  &&
         
        first_PRpMAd2 <= first_MAplMAd2

      )||(CAOA==true&&Hour()>=CloseH)){

        if(IsTradeAllowed()==true)OCbuy=OrderClose(NULL,NULL,NULL,Slippage,clrRed);
        if(IsTradeContextBusy()==true)Sleep(Sl_MS);
         
        Print("Closed Buy:"

              "-Ask=",Ask,
              "-Bid=",Bid,
              "-Spr=",SPR,
              "-1.onePR=",first_onePR,
              "-1.PRpMAd2=",first_PRpMAd2,
              "-1.MAplMAd2=",first_MAplMAd2

            );

} }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
} } }
//=============================================================================================================
// E A  F U N K T I O N E N  B E E N D E N
//=============================================================================================================
}// void OnTick



Alle Zeitangaben in WEZ +2. Es ist jetzt 01:52 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