Versucht viel, um den Code für "LotsProgression" Funktion für meine EA aber seine verwirrend zu bekommen. Können Sie Jungs bitte markieren Sie den Code in unten Quelle, die für Lose Progression geschrieben wird? (und bitte auch sagen, dass, wie ein Teil der Quelle wie hier zu markieren
externint expertId = 183547;
externint TakeProfit=40;
externint StopLoss=10;
externint BreakevenStop = 30;
externbool TimeEntry=true;
externstring StartTime="7:00";
externstring StopTime="17:00";
externbool PriceEntry=false;
externdouble Price=1.5500;
externbool FirstLong=false;
externstring LotsProgression="0.1;0.1;0.2;0.3;0.4;0.6;0.8;1.1;1.5;2.0;2.7;3.6;4.7;6.2;8.0;10.2;13.0;16.5;20.8;26.3;33.1;41.6;52.2;65.5;82.5;103.9;130.9;165;207.9;262;330.1;416;524.7;661.1";
externbool RestartNewCycle = true;
externint slippage=3; //slippage for market order processingexternint OrderTriesNumber=10; //to repeat sending orders when you receive an error or requoteexternstring EAName="PowerSM";
bool buysig,sellsig,cycleended;
int tries,long,short,co,plen,lord,mord,lpos;
double Lot,lots[],tlot,lop,lcp,lsl,ltp;
double lbid = -1;
int counter = 0;
int init()
{
int i,j,k;
string ls;
while (true) {
j=StringFind(LotsProgression,";",i);
if (j>0) {
ls=StringSubstr(LotsProgression,i,j-i);
i=j+1;
k++;
ArrayResize(lots,k);
lots[k-1]=StrToDouble(ls);
} else {
ls=StringSubstr(LotsProgression,i);
k++;
ArrayResize(lots,k);
lots[k-1]=StrToDouble(ls);
break;
}
}
plen=ArraySize(lots);
}
void start() {
//---- check for history and tradingif(Bars<100 || IsTradeAllowed()==false) return;
if (lbid == -1) lbid = Bid;
co=CalculateCurrentOrders();
if (co > 0) counter = 1;
CheckForSignals();
CheckForOpen();
DoBreakEven(BreakevenStop,0);
lbid = Bid;
}
int CalculateCurrentOrders() {
int ord; string c;
//----for(int i=0;i<OrdersTotal();i++) {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==expertId) {
ord++;
if (OrderType()==OP_BUY) {
mord=1;
if (OrderClosePrice()-OrderOpenPrice()>BreakevenStop*Point) tlot=MathAbs(tlot); else tlot=-MathAbs(tlot);
}
if (OrderType()==OP_SELL) {
mord=-1;
if (-OrderClosePrice()+OrderOpenPrice()>BreakevenStop*Point) tlot=MathAbs(tlot); else tlot=-MathAbs(tlot);
}
c=StringSubstr(OrderComment(),0,StringFind(OrderComment(),"_",0));
lpos=StrToInteger(c);
return(ord);
}
}
//---- return orders volumereturn(ord);
}
double GetLastTrade()
{
int ord; lord=0;
string c;
//----for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==expertId)
{
if (OrderType()==OP_BUY) lord=1;
if (OrderType()==OP_SELL) lord=-1;
c=StringSubstr(OrderComment(),0,StringFind(OrderComment(),"_",0));
lpos=StrToInteger(c);
lop = NormalizeDouble(OrderOpenPrice(), Digits);
lcp = NormalizeDouble(OrderClosePrice(), Digits);
lsl = NormalizeDouble(OrderStopLoss(), Digits);
ltp = NormalizeDouble(OrderTakeProfit(), Digits);
if (OrderProfit()>0)
return(OrderLots());
elsereturn(-OrderLots());
}
}
return(0);
}
bool IsEntryTime()
{
datetime tm0 = TimeCurrent();
datetime tm1 = StrToTime(TimeToStr(tm0, TIME_DATE) + " " + StartTime);
datetime tm2 = StrToTime(TimeToStr(tm0, TIME_DATE) + " " + StopTime);
bool isTm = false;
if (tm1 <= tm2)
isTm = isTm || (tm1 <= tm0 && tm0 < tm2);
else
isTm = isTm || (tm1 <= tm0 || tm0 < tm2);
return (isTm);
}
void CheckForSignals()
{
buysig = false;
sellsig = false;
if (co > 0) return;
if (TimeEntry)
{
bool cond = IsEntryTime();
if (!cond) return;
}
if (PriceEntry)
{
cond = ((Bid >= Price && lbid < Price) || (Bid <= Price && lbid > Price));
if (!cond) return;
}
double lastlot = GetLastTrade();
if (lastlot >= 0)
{
if (counter > 0)
{
if (!RestartNewCycle) return;
}
if (FirstLong)
buysig = true;
else
sellsig = true;
lpos = 0;
Lot = lots[0];
}
else
{
lpos++;
int BE = 0;
if (lord > 0 && lcp == lop+BE*Point) lpos--;
if (lord < 0 && lcp == lop-BE*Point) lpos--;
Lot = lots[lpos];
if (lord > 0)
sellsig = true;
elseif (lord < 0)
buysig = true;
}
}
void CheckForOpen() {
int res,tr,TP;
//---- sell conditionsif(sellsig && co==0) {
Print("sell open ",Lot," ",lpos);
res = OpenAtMarket(OP_SELL,Lot,TakeProfit,lpos);
if (res>0) { tlot=Lot; }
return;
}
//---- buy conditionsif(buysig && co==0) {
Print("buy open ",Lot," ",lpos);
res = OpenAtMarket(OP_BUY,Lot,TakeProfit,lpos);
if (res>0) { tlot=Lot; }
return;
}
}
int OpenAtMarket(int mode,double lot,int TP,int pos) {
int res,tr,col;
double openprice,sl,tp;
tries=0;
while (res<=0 && tries<OrderTriesNumber) {
tr=0; while (tr<5 && !IsTradeAllowed()) { tr++; Sleep(2000); }
RefreshRates();
if (mode==OP_SELL) {
openprice=Bid;
if (StopLoss>0) sl=openprice+StopLoss*Point;
if (TP>0) tp=openprice-TP*Point;
col=Red;
} else {
openprice=Ask;
if (StopLoss>0) sl=openprice-StopLoss*Point;
if (TP>0) tp=openprice+TP*Point;
col=Blue;
}
res=OrderSend(Symbol(),mode,lot,openprice,slippage,sl,tp,pos+"_"+EAName+"_"+expertId,expertId,0,col);
tries++;
}
Print("market order:: ",Symbol()," ",mode," ",lot," ",openprice," ",sl," ",tp," ",pos+"_"+EAName+"_"+expertId);
if (res<=0) Print("error opening order : ",ErrorDescription(GetLastError()));
return(res);
}
void DoBreakEven(int BP, int BE) {
bool bres;
for (int i = 0; i < OrdersTotal(); i++) {
if ( !OrderSelect (i, SELECT_BY_POS) ) continue;
if ( OrderSymbol() != Symbol() || OrderMagicNumber() != expertId ) continue;
if ( OrderType() == OP_BUY ) {
if (Bid<OrderOpenPrice()+BP*Point) continue;
if ( OrderOpenPrice()+BE*Point-OrderStopLoss()>Point/10) {
//Print(BP," ",BE," bestop");
bres=OrderModify (OrderTicket(), OrderOpenPrice(), OrderOpenPrice()+BE*Point, OrderTakeProfit(), 0, Black);
if (!bres) Print("Error Modifying BE BUY order : ",ErrorDescription(GetLastError()));
}
}
if ( OrderType() == OP_SELL ) {
if (Ask>OrderOpenPrice()-BP*Point) continue;
if ( OrderStopLoss()-(OrderOpenPrice()-BE*Point)>Point/10) {
//Print(BP," ",BE," bestop");
bres=OrderModify (OrderTicket(), OrderOpenPrice(), OrderOpenPrice()-BE*Point, OrderTakeProfit(), 0, Gold);
if (!bres) Print("Error Modifying BE SELL order : ",ErrorDescription(GetLastError()));
}
}
}
return;
}
/*
int FindPos(double ls) {
for (int i=0; i<plen; i++) {
if (NormalizeDouble(MathAbs(lots[i]-ls),3)<0.001) return(i);
}
return(-1);
}
*/
qgmql: Hervorhebung des Codes im untenstehenden Quelltext, der für die Lots-Progression geschrieben ist? (und bitte auch sagen, dass, wie man einen Teil der Quelle zu markieren
Verwenden Sie nicht tickvalue selbst https://www.mql5.com/en/forum/133792/page3#512466
Ich habe nicht verstanden, was du mir sagen wolltest,
Auch ich habe nicht verstanden, was Sie mit dem Link, den Sie geteilt haben, sagen wollen. In meinem Code,
Würden Sie ihn bitte ändern? So könnte ich es besser verstehen.
@RaptorUK Dieses Mal...
Beide haben funktioniert, kein Fehler. Seltsam. Aber ich habe es trotzdem geändert.
Wo kann ich jetzt https://docs.mql4.com/indicators/iama finden???
Es ist kaputt, ich habe ein Ticket an den Service Desk geschickt ... in der Zwischenzeit
iMA
Berechnet den Indikator Gleitender Durchschnitt und gibt seinen Wert zurück.
double iMA(
string symbol, // symbol
int zeitrahmen, // zeitrahmen
int ma_period, // MA-Mittelungszeitraum
int ma_shift, // MA-Verschiebung
int ma_method, // Mittelungsmethode
int applied_price, // Angewandter Preis
int shift //Verschiebung
);
Parameter
Symbol
[in] Name des Symbols, für dessen Daten der Indikator berechnet werden soll. NULL bedeutet das aktuelle Symbol.
Zeitrahmen
[in] Zeitrahmen. Es kann ein beliebiger Wert der ENUM_TIMEFRAMES Aufzählung sein. 0 bedeutet den aktuellen Chart-Zeitrahmen.
ma_period
[in] Mittelungszeitraum für die Berechnung.
ma_shift
[in] MA-Verschiebung. Die Verschiebung der Indikatorlinien bezieht sich auf den Chart nach Zeitrahmen.
ma_method
[in] Methode des gleitenden Durchschnitts. Es kann einer der ENUM_MA_METHOD Aufzählungswerte sein.
angewandter_preis
[in] Angewandter Preis. Es kann ein beliebiger Wert aus der Aufzählung ENUM_APPLIED_PRICE sein.
shift
[in] Index des aus dem Indikatorpuffer entnommenen Wertes (Verschiebung gegenüber dem aktuellen Balken um die angegebene Anzahl von Perioden).
Zurückgegebener Wert
Numerischer Wert des Indikators Gleitender Durchschnitt.
Beispiel:
AlligatorJawsBuffer[i]=iMA(NULL,0,13,8,MODE_SMMA,PRICE_MEDIAN,i);
Es ist kaputt, ich habe inzwischen ein Ticket beim Service Desk eingereicht....
Was sollte ich für die Funktion"Experte starten" verwenden?
oder kann ich beides im neuen Meta-Editor verwenden?
(Ich denke, ich frage über eine sehr grundlegende Sache, aber eigentlich habe ich null Wissen und bin daran interessiert, es zu lernen).
Was sollte ich für die Funktion "Experte starten" verwenden?
oder kann ich beides im neuen Meta-Editor verwenden?
(Ich denke, ich frage über eine sehr grundlegende Sache, aber eigentlich habe ich null Wissen und bin daran interessiert, es zu lernen).
Versucht viel, um den Code für "LotsProgression" Funktion für meine EA aber seine verwirrend zu bekommen. Können Sie Jungs bitte markieren Sie den Code in unten Quelle, die für Lose Progression geschrieben wird? (und bitte auch sagen, dass, wie ein Teil der Quelle wie hier zu markieren
double lots[]Versucht viel, um den Code für "LotsProgression" Funktion für meine EA zu bekommen, aber seine verwirrend.
Was ist verwirrend kann u erklären ur Problem
Ich denke, mit diesem #property strict müssen Sie i,j,k auf einen Wert initialisieren...
int i=0,j=0,k=0;
PipPip...Jimdandy