Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 539

 
tatianati:

Ich danke Ihnen! Es funktionierte, ich war glücklich wie ein Kind, aber der Berater zeigte nicht mehr "neu" an. Können Sie mir sagen, wo ich einen Fehler gemacht habe?

Aha, ich habe den Fehler gefunden, aber nicht dort, wo ich ursprünglich gesucht habe. Die nächste Aufgabe kann ich selbst nicht bewältigen.

Bitte teilen Sie mir mit, wie ich die Abweichungsspanne - Entfernung des Preises aus dem MA - festlegen kann.

extern string s10                = ">>>>>>>>>>>>>>>>>>>>>>>>>>>>";
extern string s11                = ">>> Вход против МА";
extern int    iMA_Period         = 365;
extern int    iMA_OpenDistance   = 60;     // как задать диапазон? например 60-85 за его пределами не открывать ордеров

Hier ist der Eingangsteil

int GetSignal()
{
  int Signal = 0;

  double iMA_Signal = iMA(Symbol(), 0, iMA_Period, 0, MODE_SMMA, PRICE_CLOSE, 0);
  
  int Ma_Bid_Diff = MathAbs(iMA_Signal - Bid)/vPoint;
  
  if(Ma_Bid_Diff > iMA_OpenDistance && Bid > iMA_Signal) Signal = -1;
  if(Ma_Bid_Diff > iMA_OpenDistance && Bid < iMA_Signal) Signal = 1;
  
  return(Signal);
}
 
tatianati:

Huh, ich habe den Fehler gefunden, aber nicht dort, wo ich ursprünglich gesucht habe. Ich kann die nächste Aufgabe nicht allein bewältigen.

Können Sie mir sagen, wie ich die Abweichungsspanne - den Abstand des Preises vom MA - einstellen kann?

Hier ist der Eingangsteil


extern int    Min_iMA_OpenDistance   = 60;
extern int    Max_iMA_OpenDistance   = 85;

Und dementsprechend ist die Bedingung

if(Ma_Bid_Diff > Min_iMA_OpenDistance && Ma_Bid_Diff < Max_iMA_OpenDistance && Bid > iMA_Signal)
 

Wir müssen die Ausgangsdaten im Advisor korrekt in (1 Kauf, -1 Verkauf) ändern

//+------------------------------------------------------------------+

//| SimpleBars_rob.mq4 |
//| Copyright © 2010, ENSED Team |
//| http://www.ensed.org |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, ENSED Team"
#property link "http://www.ensed.org"

extern int SL = 50; // Stop-Loss-Wert (in Pips)
TP = 150; // Take Profit-Wert (in Punkten)
extern double Lots = 0.1; // Arbeitslos (Mikro-Lose - 0.01, Mini-Lose - 0.1, normale Lose - 1.0)
extern string Order_Comment = "robot"; // Kommentar, der für Bestellungen verwendet wird
extern int Slipage = 5; // maximal zulässige Schlupfhöhe (in Punkten)
extern int int Magic_Number = 777; // magische Anzahl von Aufträgen für den Roboter (um "freundliche" Geschäfte zu unterscheiden)
extern bool Play_Sound = false; // Abspielen von Sound beim Öffnen: true - erlaubt, false - verboten

//--------------------------------------------------------------------------------------------------------------------+
//+ Einrichtung der Zeitrahmen und Parameter des SimpleBars-Indikators |
extern int period = 6;
extern bool useClose = true;
extern int Breite = 3;
//+ Anpassung der Zeitrahmen und Parameter des Indikators SimpleBars |
//--------------------------------------------------------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------------------------------------+
//+ Nachlaufender Stopp |
extern bool UseTrailing = true; // Trailing-Stop ein/aus
extern int TrailingStop = 50; // feste Trailing-Stop-Größe (in Pips)
extern int TrailingStep = 1; // Trailing-Stop-Schritt (in Punkten)
//+ Nachlaufender Stopp
//+-------------------------------------------------------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------------------------------------+
//| Die Funktion wird bei der Programminitialisierung ausgeführt.
void init() {
if(GlobalVariableCheck("this_bar "+Symbol()+Periode()))
GlobalVariableLöschen("dieser_Balken "+Symbol()+Periode());
Rückkehr;
}
//| Funktion, die während der Programminitialisierung ausgeführt wird ||.
//+-------------------------------------------------------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------------------------------------+
//| Die Funktion wird bei der Deinitialisierung des Programms ausgeführt.
void deinit() {
if(GlobalVariableCheck("this_bar "+Symbol()+Periode()))
GlobalVariableLöschen("dieser_Balken "+Symbol()+Periode());
Rückkehr;
}
//| Funktion, die bei der Deinitialisierung des Programms ausgeführt wird
//+-------------------------------------------------------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------------------------------------+
//| Funktion der Suche nach einem Handelssignal |
int fsignals() {
double signal = iCustom(NULL, 0, "SimpleBars", period, 0, 1, 4, 0);
return(0); // Signal zum Öffnen eines Kaufs
return(1); //Verkaufssignal öffnen
return(-1); // kein Signal
} //end int fsignals()
//| Funktion der Suche nach einem Handelssignal
//+-------------------------------------------------------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------------------------------------+
//| Funktion zur Verfolgung der Arbeit des Roboters an der angegebenen Stange
bool this_bar() {
wenn(
(!GlobalVariableCheck("this_bar "+Symbol()+Periode()))
|| (GlobalVariableGet("dieser_Balken "+Symbol()+Zeitraum()!=Zeit[0])
) {
GlobalVariableSet("this_bar "+Symbol()+Periode(),Time[0]);
return(false);
} sonst {
return(true);
} //end if (. (!GlobalVariableCheck("this_bar "+Symbol()+Periode()))
} //end bool this_bar()
//| Funktion der Verfolgung der Tatsache, dass der Roboter an der gegebenen Stange arbeitet
//+-------------------------------------------------------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------------------------------------+
//| Funktion der Suche nach Aufträgen dieses Typs |
bool find_orders(int magic=-1, int type=-1, string symb="NULL") {
/* gibt true zurück, wenn mindestens eine Bestellung des angegebenen Typs mit der angegebenen magischen Zahl durch das angegebene Symbol gefunden wird */
for (int i=OrdersTotal()-1; i>=0; i--) {
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
if(((OrderType()==type) || (type==-1))
&& ((OrderMagicNumber()==magic) || (magic==-1))
&& ((OrderSymbol()==Symbol() || (symb=="NONE")))) {
//wenn ein Auftrag gefunden wird, return(true) und die Schleife verlassen
return(true);
Pause;
} //end if((OrderType()==type) && (OrderMagicNumber()==magic) && (OrderSymbol()==Symbol())
} //end for (int i2=OrdersTotal()-1; i2>=0; i2--)

return(false); //return false
} //end bool find_orders(int magic, int type)
//| Funktion der Suche nach Aufträgen des angegebenen Typs |
//+-------------------------------------------------------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------------------------------------+
//| Funktion zur Berechnung des Stop-Loss-Wertes für Aufträge |
double sl(int sl_value, int type, double price=0.0, string symb="NONE", int rmode=1) {
//type=0 -> Marktkäufe
//type=1 -> Marktverkäufe
if(symb=="NONE") symb=Symbol();
if(type==0) price=NormalizeDouble(MarketInfo(symb,MODE_ASK),MarketInfo(symb,MODE_DIGITS))
if(type==1) price=NormalizeDouble(MarketInfo(symb,MODE_BID),MarketInfo(symb,MODE_DIGITS));
if(sl_value<=0) return(0);
if(rmode==1) {
if((type==0) || (type==2) || (type==4)) return(MarketInfo(symb,MODE_ASK)-sl_value*MarketInfo(symb,MODE_POINT)); //für Käufe
if((type==1) || (type==3) || (type==5)) return(MarketInfo(symb,MODE_BID)+sl_value*MarketInfo(symb,MODE_POINT)); //für Verkauf
}
if(rmode==2) {
if((type==0) || (type==2) || (type==4)) return(MarketInfo(symb,MODE_BID)-sl_value*MarketInfo(symb,MODE_POINT)); //für Kauf
if((type==1) || (type==3) || (type==5)) return(MarketInfo(symb,MODE_ASK)+sl_value*MarketInfo(symb,MODE_POINT)); //für Verkauf
}
} //end double sl(int sl_value, int type, double price=0.0, string symb="NONE", int rmode=1)
//| Funktion zur Berechnung des Stop-Loss-Wertes für Aufträge |
//+-------------------------------------------------------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------------------------------------+
//| Funktion zur Berechnung von Take Profit-Werten für Aufträge
double tp(int tp_value, int type, double price=0.0, string symb="NONE") {
//type=0 -> Marktkauf
//type=1 -> Marktverkäufe
if(symb=="NONE") symb=Symbol();
if(type==0) price=NormalizeDouble(MarketInfo(symb,MODE_ASK),MarketInfo(symb,MODE_DIGITS);
if(type==1) price=NormalizeDouble(MarketInfo(symb,MODE_BID),MarketInfo(symb,MODE_DIGITS));
if(tp_wert<=0) return(0);
if((type==0) || (type==2) || (type==4)) return(price+tp_value*MarketInfo(symb,MODE_POINT)); //für Käufe
if((type==1) || (type==3) || (type==5)) return(MarketInfo(symb,MODE_BID)-tp_value*MarketInfo(symb,MODE_POINT)); //für Verkäufe
} //end double tp(int tp_value, int type, double price=0.0, string symb="NONE")
//| Funktion zur Berechnung des Take Profit Wertes für Aufträge |
//+-------------------------------------------------------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------------------------------------+
//| Funktion der Auftragseröffnung
void open_positions(int signal, double lot, double price=0.0, string symb="NONE") {
//signal=0 -> Signal zum Kauf eröffnen
//signal=1 -> Signal zum Öffnen des Verkaufs
/* extern */ int Count_Of_Trade_Try=5, Pause_Of_Trade_Try=5;

int i = 0; //Variable für den Schleifenzähler
int err = 0;

if(symb=="NONE") symb=Symbol();
if(Signal==0)
price=NormalizeDouble(MarketInfo(symb,MODE_ASK),MarketInfo(symb,MODE_DIGITS)); //offener Preis für den Kauf
if(Signal==1)
price=NormalizeDouble(MarketInfo(symb,MODE_BID),MarketInfo(symb,MODE_DIGITS)); //offener Preis für den Verkauf

while(i<=Count_Of_Trade_Try) {
Die //Funktion zum Öffnen des Auftrags (eingebaut). Um die Wahrnehmung zu erleichtern, sind die Parameter in verschiedenen Zeilen untergebracht:
int ticket = OrderSend(Symbol(), //Symbol
Signal, //Auftragsart
Los, //Volumen
Preis, //offener Preis
Slipage, //Ebene der zulässigen Requotes
sl(SL,signal), // Wert des Stop Loss
tp(TP,Signal), //Gewinnwert übernehmen
Bestellung_Comment, //Kommentar zur Bestellung
Magische_Nummer, //magische Nummer
0, //Ablaufzeit (wird für schwebende Aufträge verwendet)
CLR_NONE); //Farbe des im Diagramm angezeigten Pfeils (CLR_NONE - Pfeil wird nicht gezeichnet)
if(ticket!=-1) //wenn die Öffnung erfolgreich war, ein grafisches Objekt zeichnen und die Schleife verlassen
Pause;
err=GetLastError();
if(err!=0) Print("Fehler: "+Market_Err_To_Str(err));
i++;
Sleep(Pause_Of_Trade_Try*1000); //im Falle eines Fehlers, Pause vor erneutem Versuch
} //end while(i<=count)
} //end void open_positions(int signal, double lot, double price=0.0, string symb="NONE")
Funktion zum Eröffnen von Aufträgen //|
//+-------------------------------------------------------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------------------------+
//| Funktion der Dekodierung von Fehlercodes |
string Market_Err_To_Str(int err) {
/* Funktion deckt nur Fehlercodes von Handelsoperationen ab */
switch(err) {
case(0): return("Kein Fehler");
case(1): return("Kein Fehler, aber das Ergebnis ist unbekannt");
case(2): return("Allgemeiner Fehler");
case(3): return("Falsche Parameter");
case(4): return("Der Handelsserver ist beschäftigt");
case(5): return("Alte Version des Client-Terminals");
case(6): return("Keine Verbindung zum Handelsserver");
case(7): return("Nicht genug Rechte");
case(8): return("Zu häufige Anfragen");
case(9): return("Ungültiger Vorgang, der den Serverbetrieb stört");
case(64): return("Konto gesperrt");
case(65): return("Falsche Kontonummer");
case(128): return("Die Frist für die Transaktion ist abgelaufen");
case(129): return("Falscher Preis");
case(130): return("Falsche Haltestellen");
case(131): return("Falsches Volumen");
case(132): return("Der Markt ist geschlossen");
case(133): return("Handel verboten");
case(134): return("Nicht genug Geld, um die Transaktion auszuführen");
case(135): return("Der Preis hat sich geändert");
case(136): return("Kein Preis");
case(137): return("Der Makler ist beschäftigt");
case(138): return("Neue Preise");
case(139): return("Der Auftrag ist blockiert und wird bereits bearbeitet");
case(140): return("Nur Kauf erlaubt");
case(141): return("Zu viele Anfragen");
case(145): return("Die Änderung ist nicht zulässig, da der Auftrag zu nahe am Markt liegt");
case(146): return("Das Handelsteilsystem ist beschäftigt");
case(147): return("Die Verwendung des Verfallsdatums ist vom Broker verboten");
case(148): return("Die Anzahl der offenen und schwebenden Aufträge hat das vom Broker festgelegte Limit erreicht;)
case(149): return("Versuch, eine Gegenposition zu einer bestehenden Position zu eröffnen, wenn Hedging verboten ist");
case(150): return("Versuch, eine Position auf einem Symbol unter Verstoß gegen die FIFO-Regel zu schließen");

Standard: return("");
} //end switch(err)
} //end string Err_To_Str(int err)
//| Funktion zur Dekodierung von Fehlercodes |
//+-------------------------------------------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------------------------+
//| Operationen zum Abschluss von Transaktionen
//+----------------------------------------------------------------------------------------------------+
//| Funktion zum Abschließen eines Auftrags anhand seiner Nummer (Ticket) |


bool close_by_ticket(int c_ticket, int slipage) {
/*
Funktion des Abschlusses eines Geschäfts nach seiner Nummer (Ticket).
Bei der Schließung eines Marktauftrags wird die Höhe der maximal zulässigen Slippage berücksichtigt (Slippage)
*/
/* extern */ int Count_Of_Trade_Try=5, Pause_Of_Trade_Try=5;

int i = 0; //Variable für den Schleifenzähler
int err = 0;
bool ticket = false; //Variable für den (un)erfolgreichen Abschluss eines Geschäfts
double price = 0.0; //Preis für das abzuschließende Geschäft (für Marktaufträge)
if(OrderSelect(c_ticket,SELECT_BY_TICKET,MODE_TRADES)) { //Auswahl der Bestellung nach Ticket
if(OrderType()==OP_BUY) price = NormalizeDouble(Bid,Digits); //Preis für Kauf
if(OrderType()==OP_SELL) price = NormalizeDouble(Ask,Digits); //Preis für Verkauf
for(i=0;i<=Count_Of_Trade_Try;i++) {
if(OrderType()<=1) //wenn es sich um eine Marktorder handelt, wird sie geschlossen, wenn es sich um eine schwebende Order handelt, wird sie gelöscht
ticket=OrderClose(OrderTicket(),OrderLots(),price,slipage,CLR_NONE);
sonst
ticket=OrderDelete(OrderTicket());

if(ticket) { //wenn das Schließen oder Löschen erfolgreich war - true zurückgeben und die Schleife verlassen
return(true);
Pause;
} //end if(ticket)
err=GetLastError();
if(err!=0) Print("Fehler: "+Market_Err_To_Str(err));
Sleep(Pause_Of_Trade_Try*1000); //im Falle eines Fehlers, Pause vor erneutem Versuch
} //end for(i=0;i<=Count_Of_Trade_Try;i++)
} //end if(OrderSelect(c_ticket,SELECT_BY_TICKET,MODE_TRADES))

return(false); //return false
} //end bool close_by_ticket(int c_ticket)
//| Funktion zum Abschließen eines Auftrags anhand seiner Nummer (Ticket) |
//+----------------------------------------------------------------------------------------------------+

bool cbm(int magic, int slipage, int type) {
/*
Close by magic (schließt alle Aufträge des angegebenen Typs mit der angegebenen MagicNumber)
Der maximal zulässige Schlupf wird berücksichtigt
Die Funktion close_by_ticket wird verwendet.
*/
int n = 0;
while (find_orders(magic, type))
for (int i2=OrdersTotal()-1; i2>=0; i2--) {
if (!OrderSelect(i2,SELECT_BY_POS,MODE_TRADES)) break;

if ((OrderType()==type) && (OrderMagicNumber()==magic)) {
close_by_ticket(OrderTicket(), slip;)
n++;
} //end if (((OrderType()==OP_BUY) || (OrderType()==OP_SELL)) && (OrderMagicNumber()==magisch))
} //end for (int i2=OrdersTotal()-1; i2>=0; i2--)

wenn(n>0)
return(true);

return(false);
} //end bool cbm(int magic, int slipage, int type)
Handelsabschlüsse //| Handelsabschlüsse |
//+-------------------------------------------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------------------------------------+
Nachlaufender Stop-Loss //|
void T_SL() {
if(!UseTrailing) return;
int i = 0;
for(i=0; i<OrdersTotal(); i++) {
if(!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) weiter;
if(OrderSymbol() != Symbol() || OrderMagicNumber()!=Magic_Number) weiter;

if(Auftragsart()==OP_BUY) {
if(NormalizeDouble(Bid-OrderOpenPrice(),Digits)>NormalizeDouble(TrailingStop*Point,Digits)) {
if(NormalizeDouble(OrderStopLoss(),Digits)<NormalizeDouble(Bid-(TrailingStop+TrailingStep-1)*Point,Digits))
OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop*Point,Digits), OrderTakeProfit(), 0, CLR_NONE)
} //end if(NormalizeDouble(Bid-OrderOpenPrice(),Digits)>NormalizeDouble(TrailingStop*Point,Digits))
} //end if(OrderType()==OP_BUY)

if(OrderType()==OP_SELL) {
if(NormalizeDouble(OrderOpenPrice()-Ask,Digits)>NormalizeDouble(TrailingStop*Point,Digits)) {
if(NormalizeDouble(OrderStopLoss(),Digits)>NormalizeDouble(Ask+(TrailingStop+TrailingStep-1)*Point,Digits))
OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+TrailingStop*Point,Digits), OrderTakeProfit(), 0, CLR_NONE)
} //end if(NormalizeDouble(OrderOpenPrice()-Ask,Digits)>NormalizeDouble(TrailingStop*Point,Digits))
} //end if(OrderType()==OP_SELL)
} //end for(i=0; i<OrdersTotal(); i++)
} //end void T_SL()
Nachlaufender Stop-Loss //|
//+-------------------------------------------------------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------------------------------------+
//| Hauptfunktion |
void start() {

int sig = fsignals();

if(!find_orders(Magic_Number)) {
if((sig!=-1)) {
if(!this_bar()) {
open_positions(sig, Lots);
if(Play_Sound)
PlaySound("alert.wav");
}
} //end if((sig!=-1) && (!this_bar())
} sonst {
if(sig==0) {
if(cbm(Magic_Number, Slipage, 1)) {
open_positions(sig, Lots);
if(Play_Sound)
PlaySound("alert.wav");
} //end if(cbm(Magic_Number, Slipage, 1))
} //end if(sig==0)
if(sig==1) {
if(cbm(Magic_Number, Slipage, 0)) {
open_positions(sig, Lots);
if(Play_Sound)
PlaySound("alert.wav");
} //end if(cbm(Magic_Number, Slipage, 0))
} //end if(sig==1)
T_SL();
} //end if(!find_orders(Magic_Number) (sonst)
Rückkehr;
}
//| Hauptfunktion |
//+-------------------------------------------------------------------------------------------------------------------+
 

Hallo Kenner. Hilfe - funktioniert nicht. Ich glaube, ich wurde durch die Initialisierung von Variablen verwirrt. Mir schwirrt der Kopf, aber ich kann keine Fehler finden.

Anstatt Positionen zu eröffnen, sollte der EA Pfeile zum Kurs Klose(0) zeichnen und statt zu schließen - ein Kreuz und die Daten ( fExpiration_func(Expiration), fop_time, cl_time, fop_price, cl_price, ftype) in eine neue Zeile schreiben.

Hier wird die Stochastik nur als Beispiel genommen.

 //+------------------------------------------------------------------+
//|                                                     binar_v1.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"


//--- input Time parameters
input uchar     hs = 9 ; 
input uchar     ms = 0 ; 
input uchar     he = 18 ; 
input uchar     me = 0 ;
//--- input Indicator parameters

//--- input Expiration parameters
input uchar     Expiration = 2 ; //время експирации в минутах


input bool      strategy_1  =   true ;


bool poz;                                   //открытая/закрытая позиция
datetime op_time;                         //время открытия
double op_price;                           //цена открытия
char type;                                 //тип открытой позиции -1 СЕЛЛ, 1- БАИ
//+=================================================================================+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- 
   
      
//---
   return ( INIT_SUCCEEDED );
  }
//+=================================================================================+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- destroy timer
   
      
  }
//+=================================================================================+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   //подщитаем арифметическое среднее OC за прошлую неделю
   //Пощет один раз в неделю    
     /* if(isNewBar("",PERIOD_W1)){      
         uchar iPr=iBarShift(NULL,PERIOD_M1,iTime(NULL,PERIOD_W1,1));
         uchar iPn=iBarShift(NULL,PERIOD_M1,iTime(NULL,PERIOD_W1,1))+10080;
         double avgM1=AvgOC(iPr,iPn,0);                                     // M1 OC цредняя за прошлую неделю               
      }*/
       if (!fisTradeTimeInt( 9 , 0 , 18 , 0 )) return ;                                 //Время торгов
       if (strategy_1== true )fStrategy1();
  }
//+=================================================================================+
//| Timer function                                                   |
//+------------------------------------------------------------------+

//+=================================================================================+
void fStrategy1
   (
   
   )
//--------------------   
{
   

   if (poz== true )                             //если есть открыта позиция
      fClose_Pos(op_time,op_price,type);       //закрываем
   if (poz== false ){                           //если нет открытой
      fOpen_buy(poz,op_time,op_price,type);   //покупка   
      fOpen_sell(poz,op_time,op_price,type);   //продажа
   }       
}
//+=================================================================================+
void fOpen_buy
   (
   bool & op,                                 //открытая/закрытая позиция
   datetime & out_op_time,                       //время открытия
   double & out_op_price,                         //цена открытия
   char & out_type                               //тип открытой позиции -1 СЕЛЛ, 1- БАИ
   )
//--------------------
{
   double stoch_M0_1 = iStochastic ( NULL , 0 , 5 , 3 , 3 , MODE_SMA , 0 , MODE_MAIN , 1 );
   double stoch_M0_2 = iStochastic ( NULL , 0 , 5 , 3 , 3 , MODE_SMA , 0 , MODE_MAIN , 2 );
   double stoch_M0_1s= iStochastic ( NULL , 0 , 5 , 3 , 3 , MODE_SMA , 0 , MODE_SIGNAL , 1 );
   double stoch_M0_2s= iStochastic ( NULL , 0 , 5 , 3 , 3 , MODE_SMA , 0 , MODE_SIGNAL , 2 );
   
   string arrowName;
   
   if (!op){      
       if (stoch_M0_1 < 20 && stoch_M0_2 < stoch_M0_2s && stoch_M0_1s < stoch_M0_1){
          out_type=- 1 ;
          op= true ;
          out_op_price= Close [ 0 ];
          out_op_time= Time [ 0 ];
          arrowName= "Buy" + TimeToStr ( TimeCurrent (), TIME_DATE | TIME_SECONDS );
          fDrawArrow(arrowName= "" ,out_op_price,out_op_time,Blue, 240 );               //стрелка открытой позиции
      }
          
   }     
}
//+=================================================================================+
void fOpen_sell
   (
   bool op,                                 //открытая/закрытая позиция
   datetime & out_op_time,                       //время открытия
   double & out_op_price,                         //цена открытия
   char & out_type                               //тип открытой позиции -1 СЕЛЛ, 1- БАИ
   )
//--------------------   
{      
   double stoch_M0_1 = iStochastic ( NULL , 0 , 5 , 3 , 3 , MODE_SMA , 0 , MODE_MAIN , 1 );
   double stoch_M0_2 = iStochastic ( NULL , 0 , 5 , 3 , 3 , MODE_SMA , 0 , MODE_MAIN , 2 );
   double stoch_M0_1s= iStochastic ( NULL , 0 , 5 , 3 , 3 , MODE_SMA , 0 , MODE_SIGNAL , 1 );
   double stoch_M0_2s= iStochastic ( NULL , 0 , 5 , 3 , 3 , MODE_SMA , 0 , MODE_SIGNAL , 2 );
   
   string arrowName;
   
   if (!op){      
       if (stoch_M0_1 > 80 && stoch_M0_2 > stoch_M0_2s && stoch_M0_1s > stoch_M0_1){
          out_type=- 1 ;
          op= true ;
          out_op_price= Close [ 0 ];
          out_op_time= Time [ 0 ];
          arrowName= "Sell" + TimeToStr ( TimeCurrent (), TIME_DATE | TIME_SECONDS );
          fDrawArrow(arrowName= "" ,out_op_price,out_op_time,Red, 240 );               //стрелка открытой позиции
      }
          
   }     
}
//+=================================================================================+
void fClose_Pos //jei yra atidaryta, uzdarom
   (
   datetime fop_time,                       //время открытия
   double fop_price,                       //цена открытия
   char ftype                               //тип открытой позиции -1 СЕЛЛ, 1- БАИ
   )
//-------------------   
{
   string arrowName= "Close" + TimeToStr ( TimeCurrent (), TIME_DATE | TIME_SECONDS );    
   double cl_price;
   string fileName= StringConcatenate ( "Strategy_1  " ,Expiration, " " , Period (), ".csv" );
   
   if (Expiration<= 5 ){                     //
       datetime cl_time= Expiration* 60 +op_time;                                         //время закрытия
       if ( TimeCurrent ()>=cl_time){
         
         cl_price= Close [ 0 ];               //цена закрытия         
         fDrawArrow(arrowName,cl_price,cl_time,Yellow, 251 );                             //наносим крестик на график
         fSaveToFile(fileName,Expiration, fop_time, cl_time, fop_price, cl_price, ftype);   //в новую строку сохроняем в файле
      }   
   }
   else {
      cl_time= fExpiration_func(Expiration)* 60 +op_time;                                 //время закрытия
      
       if ( TimeMinute ( TimeCurrent ())>= TimeMinute (cl_time)){
         
         cl_price= Close [ 0 ];      
         fDrawArrow(arrowName,cl_price,cl_time,Yellow, 251 );                             //наносим крестик на график
         fSaveToFile(fileName,fExpiration_func(Expiration), fop_time, cl_time, fop_price, cl_price, ftype); //в новую строку сохроняем в файле
     }
   }   
}
//+=================================================================================+
bool fisNewBar 
   (
   string f_sy,   
   int f_tf
   )
{
     int iIndex = - 1 ;
//----
     switch (f_tf)
    {
         case 1     : iIndex = 0 ; break ;
         case 5     : iIndex = 1 ; break ;
         case 15    : iIndex = 2 ; break ;
         case 30    : iIndex = 3 ; break ;
         case 60    : iIndex = 4 ; break ;
         case 240   : iIndex = 5 ; break ;
         case 1440 : iIndex = 6 ; break ;
         case 10080 : iIndex = 7 ; break ;
         default    : iIndex =- 1 ; break ;
    }
    
     static int LastBar[ 8 ]= { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }; 
     datetime curbar = iTime (f_sy, f_tf, 0 );
     if (LastBar[iIndex] != curbar)
    {
        LastBar[iIndex] = curbar;
         return ( true );
    }
     else
    { return ( false );
 }
 }
//+=================================================================================+
int fExpiration_func
   (
   uchar e
   )
//--------------------   
{  
   uchar ex= 0 ;
   uchar mod= 0 ;
   if (e< 6 ) 
      ex=e; //return(e);
   else {
      mod= fmod (e, 5 );
       if (mod== 4 ) 
         ex=e+mod; //return(e+mod);
       else
         if (mod < 4 ) 
            ex=e-mod; //return(e-mod);
    }     
   return (ex); //grazina laiko tarpa minutemis
}
//+=================================================================================+
bool fisTradeTimeInt     //время торгов
   (
   uchar hstart= 0 , 
   uchar mstart= 0 , 
   uchar hend= 0 , 
   uchar mend= 0
   ) 
//--------------------   
{
   datetime db, de;           
   uchar       hc;              

  db= StrToTime ( TimeToStr ( TimeCurrent (), TIME_DATE )+ " " +hstart+ ":" +mstart);
  de= StrToTime ( TimeToStr ( TimeCurrent (), TIME_DATE )+ " " +hend+ ":" +mend);
  hc= TimeHour ( TimeCurrent ());
   if (db>=de) {
     if (hc>=hend) de+= 24 * 60 * 60 ; 
     else db-= 24 * 60 * 60 ;
  }
   if ( TimeCurrent ()>=db && TimeCurrent ()<=de) return ( True );
   else return ( False );
}
//+=================================================================================+
void fDrawArrow //наносим стрелки на график
   (
   string arrowName= "" ,
   double dwPrice= 0 ,
   datetime dwTime= 0 ,
   color dwColor=Silver,
   uchar dwArrowIndex= 0
   )
//--------------------   
{
   ObjectCreate       ( 0 ,arrowName, OBJ_ARROW , 0 , 0 , 0 , 0 , 0 );                 // создадим стрелку
   ObjectSetInteger   ( 0 ,arrowName, OBJPROP_ARROWCODE ,dwArrowIndex);       // установим код стрелки
   ObjectSetInteger   ( 0 ,arrowName, OBJPROP_COLOR ,dwTime);                 // зададим время
   ObjectSetInteger   ( 0 ,arrowName, OBJPROP_COLOR ,dwColor);               // зададим Цвет
   ObjectSetDouble    ( 0 ,arrowName, OBJPROP_PRICE ,dwPrice);               // зададим цену
   ChartRedraw ( 0 );
}
//+=================================================================================+
//Aritmetinis vidurkis

double fAvgOC
   (
   uchar count_start,       //nuo kurio baro pradesim skaiciuoti
   uchar end_count,         //iki kurio baro skaiciuosime
   uchar j= 0                //keli barai is eiles
   )
//--------------------   
{
   static double sum= 0 ;
   if (sum== 0 ){
       int n= 0 ;
       for ( int i=end_count; i<count_start; i++){
         double h= iClose ( NULL , PERIOD_M1 ,i);  
         double l= iOpen ( NULL , PERIOD_M1 ,i+j); 
         sum+= fabs (h-l);                   //padidinam avg 
         n++;                             //kie kartu buvo didintas avg
      }
       double avg=sum/n;                           //Surandam Mean aritmetini vidurki                 
   }   
   return (avg);                           //grazina kainu skirtumo vidurki
}
//+=================================================================================+
void fSaveToFile
   (
   string fileName,
   char expirration,       //realus ekspiracijos laikas minutemis
   datetime fop_time,
   datetime fcl_time,
   double fop_price,
   double fcl_price,
   uchar ftype
   )
//--------------------   
{
   //--- правильный способ работы в "файловой песочнице"
   ResetLastError ();
  
   int filehandle= FileOpen (fileName, FILE_WRITE | FILE_CSV );
   if (filehandle!= INVALID_HANDLE )
     {
      FileWrite(filehandle,
               expirration, //real expiration time
               fop_time, //TimeToStr(op_time,TIME_DATE|TIME_SECONDS),
               fcl_time, //TimeToStr(cl_time,TIME_DATE|TIME_SECONDS),
               op_price,
               fcl_price,
               type);
       FileClose (filehandle);
       Print ( "FileOpen OK" );
     }
   else Print ( "Операция FileOpen неудачна, ошибка " ,GetLastError());
}
//+=================================================================================+
/*int gUrdala_News()
{
   HideTestIndicators(true);
   int nResult = iCustom(NULL, PERIOD_M1, "Urdala_News", MinDo, MinPosle, ChasPoyasServera, 0, 0);
   HideTestIndicators(false);
   return(nResult);
}*/
//+=================================================================================+
/*datetime SecondsAfter    //grazinamas laiko tarpas po timeOp
   (
   datetime timeOp,      //laiko atskaitos pradzia
   datetime t
   ) 
{
     
   if (t<timeOp) t=timeOp;          
   return(TimeCurrent()-t);
}*/
//+=================================================================================+
//---------------------------------------------------
   /* void click
   (
   int x, 
   int y
   ) 
   {    
      SetCursorPos(x,y); // см. тут _http://www.vsokovikov.narod.ru/New_MSDN_API/Cursor/fn_setcursorpos.htm 
      mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0); 
      mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0); 
   }*/
//+=================================================================================+
//---------------------------------------------------
   /*void key
   (
   uchar kodas
   )
   {  
      keybd_event(kodas,0,0,0);      
      keybd_event(kodas,0,KEYEVENTF_KEYUP,0); 
   } */   
 

Dann stellt sich die Frage, wie die beiden Werte zurückgegeben werden können. Versucht, aber Fehler

void OnTick()
  {
//---
   
   xy(10,20,100,100);
   Print("x=",x,"y=",y);
  }
//+------------------------------------------------------------------+
void xy(int xx,int xxx, int yy,int yyy,int & x,int & y){
   x=xx*xxx;
   y=yy+yyy;
}
 
gince:

Dann stellt sich die Frage, wie die beiden Werte zurückgegeben werden können. Versucht, aber Fehler


void OnTick()
  {
//---
   int x,y;
   xy(10,20,100,100,x,y);
   Print("x=",x,"y=",y);
  }
//+------------------------------------------------------------------+
void xy(int xx,int xxx, int yy,int yyy, int &x,int &y){
   x=xx*xxx;
   y=yy+yyy;
}
 
gince:

Dann stellt sich die Frage, wie die beiden Werte zurückgegeben werden können. Versucht, aber Fehler


Haben Sie versucht, Variablen zu verwenden? Vielleicht hilft es ja.

void OnTick()
  {
//---
   int x=100.0, y=100.0;
   xy(10,20,100, 100, x,y);
   Print("x=",x,"y=",y);
  }
//+------------------------------------------------------------------+
void xy(int xx,int xxx, int yy,int yyy,int & x,int & y){
   x=xx*xxx;
   y=yy+yyy;
}
 

Hilfe, wenn es Ihnen nichts ausmacht

einem Expert Advisor beizubringen, nach dem Indikator zu handeln

BS_Living Now ver #1.mq4 https://www.mql5.com/ru/code/11014#50910

UP= iCustom(Symbol(),NULL, "Jetzt",BQuant,0,0);

DOW= iCustom(Symbol(),NULL, "Jetzt",BQuant,1,0);


if(DOW){OrderSend(Symbol(), OP_SELL, Lot, Bid, Slip, 0, 0, "Forex-Robots.ru SELL", Magic, 0,Red);}


if(UP ){OrderSend(Symbol(), OP_BUY, Lot, Ask, Slip, 0, 0, "Forex-Robots.ru BUY", Magic, 0,Blue);}


Kommentar

(

"\n Profit: ", UP,

"\n Profit: ", DOW

);

Ich habe versucht, die Werte im Kommentar zu lesen, aber sie sind immer statisch.

 
Vinin:


Haben Sie versucht, Variablen zu verwenden? Das könnte helfen.


Danke, es funktioniert.

 
sannin:

Hilfe, wenn es Ihnen nichts ausmacht

einem Expert Advisor beizubringen, nach dem Indikator zu handeln

BS_Living Now ver #1.mq4 https://www.mql5.com/ru/code/11014#50910


UP= iCustom(Symbol(),NULL,"Now",BQuant,0,2);//

DOW= iCustom(Symbol(),NULL,"Now",BQuant,1,2);


if(DOW != 0){OrderSend(Symbol(), OP_SELL, Lot, Bid, Slip, 0, 0, "Forex-Robots.ru SELL", Magic, 0,Red);}



if(UP != 0){OrderSend(Symbol(), OP_BUY, Lot, Ask, Slip, 0, 0, "Forex-Robots.ru BUY", Magic, 0,Blue);}
Ich habe mich nicht wirklich damit befasst, aber ich glaube, es ist in etwa so.