Много пытался получить код для функции "LotsProgression" для моего советника, но он запутался. Не могли бы вы, ребята, выделить код в приведенном ниже источнике, который написан для прогрессии лотов? (и также, пожалуйста, скажите, как выделить часть исходника, как здесь)
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);
}
*/
Не используйте tickvalue само по себе https://www.mql5.com/en/forum/133792/page3#512466
Не могу понять, что вы хотели сказать,
Даже я не понял вашу мысль по ссылке, которой вы поделились. В моем коде,
не могли бы вы изменить его? Чтобы я мог понять его лучше.
@RaptorUK На этот раз...
Оба сработали, ошибки нет. Странно. Но я все же изменил его.
Где я теперь могу найти https://docs.mql4.com/indicators/iama????
Он сломан, я подал заявку в службу поддержки ... тем временем ... .
iMA
Рассчитывает индикатор Moving Average и возвращает его значение.
double iMA(
string символ, // символ
int timeframe, // таймфрейм
int ma_period, // период усреднения МА
int ma_shift, // сдвиг МА
int ma_method, // метод усреднения
int applied_price, // применяемая цена
int shift // сдвиг
);
Параметры
символ
[in] Имя символа, на данных которого будет рассчитываться индикатор. NULL означает текущий символ.
таймфрейм
[in] Таймфрейм. Это может быть любое из значений перечисления ENUM_TIMEFRAMES. 0 означает текущий таймфрейм графика.
ma_period
[in] Период усреднения для расчета.
ma_shift
[in] Смещение MA. Смещение линии индикаторов относится к графику по таймфреймам.
ma_method
[in] Метод скользящего среднего. Может быть любым из значений перечисления ENUM_MA_METHOD.
прикладная_цена
[in] Применяемая цена. Это может быть любое из значений перечисления ENUM_APPLIED_PRICE.
сдвиг
[in] Индекс значения, взятого из буфера индикатора (сдвиг относительно текущего бара на заданное количество периодов назад).
Возвращаемое значение
Числовое значение индикатора Moving Average.
Пример:
AlligatorJawsBuffer[i]=iMA(NULL,0,13,8,MODE_SMMA,PRICE_MEDIAN,i);
Он сломан, я отправил тикет в службу поддержки ... тем временем ....
Что я должен использовать для функции expert to start?
или я могу использовать оба в новом мета-редакторе?
(я думаю, что спрашиваю об очень базовых вещах, но на самом деле у меня ноль знаний и я заинтересован в их изучении).
Что я должен использовать для функции expert to start?
или я могу использовать оба в новом мета-редакторе?
(я думаю, что спрашиваю об очень базовых вещах, но на самом деле у меня ноль знаний и я заинтересован в их изучении).
Много пытался получить код для функции "LotsProgression" для моего советника, но он запутался. Не могли бы вы, ребята, выделить код в приведенном ниже источнике, который написан для прогрессии лотов? (и также, пожалуйста, скажите, как выделить часть исходника, как здесь)
double lots[]Много раз пытался получить код для функции "LotsProgression" для моего советника, но он запутался.
Что запутано, можете объяснить свою проблему?
Я думаю, что с этим #property strict вам придется инициализировать i,j,k значением...
int i=0,j=0,k=0;
PipPip... Jimdandy