Спрашивайте! - страница 117

 

int start(){

if(TimeCurrent()>D'2008.07.01 12:00:00'){Comment("EXPIRED"); return(0);}

...

return(0);

}

amatrader:
Пожалуйста, подскажите, возможно ли ограничение по дате в советнике, то есть могу ли я установить дату истечения в советнике, чтобы по достижении установленной даты он просто прекратил торговлю.

Вероятно, это будет выглядеть примерно так:-

проверить дату, если дата равна или больше чем (заданная дата), ничего не делать.

Это английская версия, мне нужна версия для MQL4...lol

Спасибо, если кто-то может помочь.
 
amatrader:
Пожалуйста, подскажите, возможно ли установить ограничение по дате в советнике, я имею в виду, могу ли я установить дату истечения в советнике, чтобы по достижении установленной даты он просто прекратил торговлю.

Скорее всего, там будет написано что-то вроде этого:-

проверить дату, если дата равна или больше чем (заданная дата) ничего не делать.

Это английская версия, мне нужна версия для MQL4...lol

Спасибо, если кто-то может помочь.

Посмотрите на эту тему https://www.mql5.com/en/forum/174194

 

Спасибо, сэр... Очень признателен.

 

Недельный High Low.

Может ли кто-нибудь опубликовать недельный индикатор High Low, подобный прилагаемому для дневного?

Или, возможно, изменить прикрепленный индикатор на недельный для меня, пожалуйста.

Заранее спасибо.

Файлы:
 

Используйте этот индикатор https://www.mql5.com/en/forum/173574/page32 (он бывает дневным, недельным и месячным).

Или этот https://www.mql5.com/en/forum/177792

Или этот https://www.mql5.com/en/forum/178698

 

Привет всем

Вот ea, которую я использую. Может кто-нибудь подскажет, что нужно изменить, чтобы одновременно срабатывали BUY-STOP и SELL_Stop. Сейчас срабатывает либо buy-stop, либо sell-stop. Я бы хотел, чтобы срабатывали оба. Во-вторых, что нужно сделать, чтобы ограничить количество ордеров на каждую свечу.

Заранее благодарю всех.

вот код:

void start() {

//---- проверка истории и торговли

if(Bars<100 || IsTradeAllowed()==false) return;

co=CalculateCurrentOrders(Symbol());

CheckForSignals();

if (co>0) CheckForClose();

CheckForOpen();

co=CalculateCurrentOrders(Symbol());

if (mkt>0) {

BreakEvenStop(BreakEven,0);

double pcnt =( (AccountEquity()-AccountBalance()) / AccountBalance())*100;

Print("Капитал счета = ",Капитал счета());

Print("Баланс счета = ",AccountBalance());

if(pcnt>EquityGainPercent)

{

int total = OrdersTotal();

for(int i=total-1;i>=0;i--)

{

OrderSelect(i, SELECT_BY_POS);

int type = OrderType();

bool result = false;

switch(type)

{

// Закрытие открытых длинных позиций

case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );

break;

// Закрытие открытых коротких позиций

case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );

break;

// Закрытие отложенных ордеров

case OP_BUYLIMIT :

case OP_BUYSTOP :

case OP_SELLLIMIT :

case OP_SELLSTOP : result = OrderDelete( OrderTicket() );

}

if(result == false)

{

Alert("Заказ " , OrderTicket() , " не удалось закрыть. Ошибка:" , GetLastError() );

Sleep(3000);

}

}

Print("ВСЕ ОРДЕРЫ ЗАКРЫТЫ-->Заблокирован на прибыли");

}

return(0);

}

}

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

//| Вычислить открытые позиции |

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

int CalculateCurrentOrders(string symbol)

{

int ord; mkt=0;

//----

for(int i=0;i<OrdersTotal();i++) {

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;

if(OrderSymbol()==symbol && OrderMagicNumber()==MagicNumber) {

ord++;

if (OrderType()==OP_BUY || OrderType()==OP_SELL) mkt++;

}

}

//---- возврат объема ордеров

return(ord);

}

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

//| Проверяем наличие открытых ордеров |

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

void CheckForSignals() {

//проверка длинных, коротких, выходных сигналов

buysig=false;

sellsig=false;

closebuy=false;

closesell=false;

remorder=false;

int isins, isouts, iskeyrev, is2brev;

if (InsideBar) isins=IsInsideBar(shift);

if (OutSideBar) isouts=IsOutSideBar(shift);

if (KeyReversalBar) iskeyrev=IsKeyReversalBar(shift);

if (TwoBarReversal) is2brev=IsTwoBarReversal(shift);

//условие сигнала длинного входа

if (isins>0 || isouts>0 || iskeyrev>0 || is2brev>0) {

buysig=true;

closesell=true;

}

//сигнал короткого входа

if (isins<0 || isouts<0 || iskeyrev<0 || is2brev<0) {

buysig=false;

sellsig=true;

closebuy=true;

}

if (last>0 && (Time[0]-last)/(Period()*60)>=CancelOrderBars) {

remorder=true;

}

}

void CheckForOpen() {

int res,tr;

//---- условия продажи

co=CalculateCurrentOrders(Symbol());

if(sellsig && lastsig!=-1) {

co=CalculateCurrentOrders(Symbol());

if (co==0) {

res = OpenStop(OP_SELLSTOP,LotsRisk(StopLoss), Low[shift]-OrderPipsDiff*Point, StopLoss, TakeProfit1);

}

lastsig=-1;

last=Time[0];

return;

}

//---- условия покупки

if(buysig && lastsig!=1) {

co=CalculateCurrentOrders(Symbol());

if (co==0) {

res = OpenStop(OP_BUYSTOP,LotsRisk(StopLoss), High[shift]+OrderPipsDiff*Point, StopLoss, TakeProfit1);

}

last=Time[0];

lastsig=1;

return;

}

}

void BreakEvenStop(int BES, int BELP) {

//перемещаем стоплосс для фиксации некоторой прибыли

bool bres;

double StopLoss;

if ( BES > 2 ) {

for (int i = 0; i < OrdersTotal(); i++) {

if ( OrderSelect (i, SELECT_BY_POS) == false ) continue;

if ( OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber ) continue;

if ( OrderType() == OP_BUY ) {

if ( Bid < OrderOpenPrice()+BES*Point ) continue;

StopLoss = OrderOpenPrice()+BELP*Point;

if ( StopLoss > OrderStopLoss() ) {

bres=OrderModify (OrderTicket(), OrderOpenPrice(), StopLoss, OrderTakeProfit(), 0, White);

if (!bres) Print("Ошибка модификации ордера BUY : ",ErrorDescription(GetLastError()));

}

}

if ( OrderType() == OP_SELL ) {

if ( Ask > OrderOpenPrice()-BES*Point ) continue;

StopLoss = OrderOpenPrice()-BELP*Point;

if ( StopLoss < OrderStopLoss() ) {

bres=OrderModify (OrderTicket(), OrderOpenPrice(), StopLoss, OrderTakeProfit(), 0, Gold);

if (!bres) Print("Ошибка модификации ордера SELL : ",ErrorDescription(GetLastError()));

}

}

}

}

return;

}

int IsKeyReversalBar(int shift) {

//Ключевой разворотный бар, открытие ключевого бара должно быть как минимум на ?пунктов выше максимума предыдущего бара.

//Закрытие ключевого бара должно совпадать с максимумом и закрытием предыдущего бара. Открытие текущего бара должно быть

//ниже, чем закрытие ключевого бара. Ордер SellStop должен быть размещен на минимуме ключевого бара, если он не будет исполнен в течение

//следующих 4 баров, то отмените ордер. См. рисунок ниже - короткая!

if (Open[shift]=Low[shift+1] && Close[shift]Close[shift]) return(1);

if (Open[shift]>High[shift+1] && Close[shift]=Close[shift+1] && Open[shift-1]<Close[shift]) return(-1);

return(0);

}

int IsTwoBarReversal(int shift) {

//Двухбарный разворот, открытие первого бара должно быть около минимума предыдущего бара, а закрытие должно быть намного ниже и

//иметь тело хорошего размера. Открытие второго бара должно быть очень близко к закрытию первого бара, но оба должны быть значительно ниже

//средней точки каждого бара, а закрытие должно быть очень близко к минимуму 2 предыдущего бара. Ордер BuyStop должен быть размещен на максимуме

//бара 1, если он не исполняется в течение 4 баров, ордер отменяется. См. рисунок ниже

if (MathAbs(Open[shift+1]-Close[shift+1])> MathAbs(Open[shift+1]-Low[shift+2])<=

MathAbs(Close[shift]-Low[shift+2])<=

MathAbs(Open[shift]-Close[shift+1]) &&

Close[shift+1]<(High[shift+1]+Low[shift+1])/2 &&

Open[shift]<(High[shift]+Low[shift])/2)

return(1);

if (MathAbs(Open[shift+1]-Close[shift+1])> MathAbs(Open[shift+1]-High[shift+2])<=

MathAbs(Close[shift]-Low[shift+2])<=

MathAbs(Open[shift]-Close[shift+1]) &&

Close[shift+1]>(High[shift+1]+Low[shift+1])/2 &&

Open[shift]>(High[shift]+Low[shift])/2)

return(-1);

return(0);

}

int OpenStop(int mode,double lot, double prc, int SL, int TP) {

int res,tr,col;

строка mail;

double openprice,sl,tp,stlev;

попытки=0;

stlev=(1+MarketInfo(Symbol(),MODE_STOPLEVEL))*Point;

while (res<=0 && tries<OrderTriesNumber) {

tr=0; while (tr<5 && !IsTradeAllowed()) { tr++; Sleep(2000); }

RefreshRates();

if (mode==OP_SELLSTOP) {

if (prc<=Bid-stlev) openprice=prc;

else openprice=Bid-stlev;

if (SL>0) sl=openprice+SL*Point;

если (TP>0) tp=openprice-TP*Point;

col=Red;

} else

if (mode==OP_BUYSTOP) {

если (prc>=Ask+stlev) openprice=prc;

else openprice=Ask+stlev;

if (SL>0) sl=openprice-SL*Point;

если (TP>0) tp=openprice+TP*Point;

col=Blue;

} else return;

Print(Ask," ",Bid," ",Symbol()," ",mode," ",lot," ",openprice," ",sl," ",tp," ");

res=OrderSend(Symbol(),mode,lot,openprice,slippage,sl,tp,EAName+"_"+MagicNumber,MagicNumber,0,col);

попытки++;

}

if (res<=0) Print("Ошибка открытия отложенного ордера : ",ErrorDescription(GetLastError()));

return(res);

}

void CheckForClose() {

bool bres; int tr;

for(int i=0;i<OrdersTotal();i++) {

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;

if(OrderMagicNumber()!=MagicNumber || OrderSymbol()!=Symbol()) continue;

//---- проверка типа ордера

if(OrderType()==OP_BUY && closebuy) {

bres=CloseAtMarket(OrderTicket(),OrderLots());

continue;

}

if(OrderType()==OP_SELL && closesell) {

bres=CloseAtMarket(OrderTicket(),OrderLots());

continue;

}

if(OrderType()==OP_BUYSTOP && (closebuy || remorder)) {

bres=DeletePending(OrderTicket());

continue;

}

if(OrderType()==OP_SELLSTOP && (closesell || remorder)) {

bres=DeletePending(OrderTicket());

continue;

}

}

}

bool DeletePending(int ticket) {

bool bres=false; int tr;

tries=0;

while (!bres && tries<OrderTriesNumber) {

bres=OrderDelete(ticket);

tries++;

tr=0; while (tr<5 && !IsTradeAllowed()) { tr++; Sleep(2000); }

}

if (!bres) Print("Ошибка при удалении ордера : ",ErrorDescription(GetLastError()));

return (bres);

}

 

Кто-нибудь знает код, чтобы заставить советника работать только с определенным номером счета? Спасибо!

 

Это здесь https://www.mql5.com/en/forum/174194 (пост #7)

 

Ты слишком много делаешь.

}
 
newdigital:
Это здесь https://www.mql5.com/en/forum/174194 (пост #7)

Спасибо newdigital.

У меня код инициализации (в котором есть истечение времени) устроен следующим образом:

int init()

{if (TimeCurrent()>D'2008.06.07 12:00:00'){Comment("please renew your subscription"); return(0);}

return(0);

}

}

if (Account != AccountNumber()){

Комментарий("Торговля на счете : "+AccountNumber()+" ЗАПРЕЩЕНА!");

return(0);

}else {Comment("");}

И теперь я получаю эту ошибку:

'}' - несбалансированные круглые скобки

Что я делаю не так? И еще, подходит ли "int Account = 111111;" к настройкам советника? Спасибо.