Временной интервал торговли советника - страница 2

 
vvx080:

Этот код не срабатывает при тестировании советника...

Это у вас не срабатывает, у остальных все работает ищите причину в другом
 
microb:
а как добавить чтобы сова не торговала в friday
if (DayOfWeek()==5) return(0);
 
Согласен. Может я что то не правильно делаю. пожалуйста прикрепите вы эту функцию к советнику
 
Зачем? моему советнику эта функция не нужна :)
 
Europa:
Это у вас не срабатывает, у остальных все работает ищите причину в другом

Помогите мне пожалуйста тогда установить его правильно. вот код советника:


//+------------------------------------------------------------------+
//| Moving Average_Мodify.mq4 |
//| Copyright © 2009, MetaQuotes Software Corp. |
//| Modify by BARS |
//+------------------------------------------------------------------+
#define MAGICMA 20050610
//-----------------------------------------
extern int StopLoss=500;
extern int TakeProfit=500;
extern double Lots = 0.1;
extern double MaximumRisk = 0.02;
extern double DecreaseFactor = 3;
extern double MovingPeriod_Open = 12;
extern double MovingPeriod_Close = 21;
extern double MovingShift = 1;

double SL,TP;

//-- Подключаемые модули --
#include <stderror.mqh>
#include <stdlib.mqh>

//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
void start() {
//---- check for history and trading
//(если на графике есть более 100 баров и торговый поток свободен)
if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
//если расчитанный размер лота соответствует текущему размеру депозита
if(CalculateCurrentOrders(Symbol())==0)
CheckForOpen();// начинием работу
else CheckForClose();//в противном случае, - закрываем позиции
}
//жжжжжжжжжжжжжжжж Конец функции void start()жжжжжжжжжжжжжжжжжжжжжжж+ 

//жжжжжжжжжж Пользовательские функции жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
//| Функция определения наличия открытых позиций |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol) {
int buys=0,sells=0; for(int i=0;i<OrdersTotal();i++) {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++; }
}
//---- return orders volume
if(buys>0) return(buys); else return(-sells);
}

//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
//| Функция расчета оптимального размера лота |
//+------------------------------------------------------------------+
double LotsOptimized() {
double lot=Lots;
int orders=HistoryTotal(); // history orders total
int losses=0; // number of losses orders without a break
//---- select lot size
lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
//---- calcuulate number of losses orders without a break
if(DecreaseFactor>0) {
for(int i=orders-1;i>=0;i--) {
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{ Print("Error in history!"); break; }
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
//----
if(OrderProfit()>0) break;
if(OrderProfit()<0) losses++;
}
if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
}
//---- return lot size
if(lot<0.1) lot=0.1;
return(lot);
}

//жжжжжжжжжжжж Функция открытия позиций жжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void CheckForOpen() {
double ma; int res;
//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//---- get Moving Average 
ma=iMA(NULL,0,MovingPeriod_Open,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//---- sell conditions
if(Open[1]>ma && Close[1]<ma) {
SL=0;TP=0;
if(StopLoss>0) SL=Bid+Point*StopLoss;
if(TakeProfit>0) TP=Bid-Point*TakeProfit; 
res=WHCOrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,SL,TP,
"Moving Average",MAGICMA,0,Red);
if(res < 0){Print("Ошибка открытия ордера SELL #", GetLastError()); 
Sleep(10000); return (0); }
}
//---- buy conditions
if(Open[1]<ma && Close[1]>ma){
SL=0;TP=0;
if(StopLoss>0) SL=Ask-Point*StopLoss;
if(TakeProfit>0) TP=Ask+Point*TakeProfit; 
res=WHCOrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,SL,TP,
"Moving Average",MAGICMA,0,Blue);
if(res < 0) { Print("Ошибка открытия ордера BUY #", GetLastError()); 
Sleep(10000); return (0); }
}
//----
}

//+жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
//| Функция закрытия позиций |
//+------------------------------------------------------------------+
void CheckForClose() {
double ma;
//---- go trading only for first tiks of new bar
//(с первым тиком нового бара начинаем работу)
if(Volume[0]>1) return;
//---- get Moving Average 
ma=iMA(NULL,0,MovingPeriod_Close,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//----
for(int i=0;i<OrdersTotal();i++) {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
//---- check order type 
if(OrderType()==OP_BUY) {
if(Open[1]>ma && Close[1]<ma) 
OrderClose(OrderTicket(),OrderLots(),Bid,3,White); break;
}
if(OrderType()==OP_SELL) {
if(Open[1]<ma && Close[1]>ma) 
OrderClose(OrderTicket(),OrderLots(),Ask,3,White); break;
}
}
//---------------------
} 

//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
//Функция предусмотрена Для открытие позиций в условиях рыночного 
//исполнения торговых заявок Market Watch
int WHCOrderSend(string symbol, int cmd, double volume,
double price, int slippage, double stoploss, 
double takeprofit, string comment,int magic, 
datetime expiration, color arrow_color)
{ int ticket = OrderSend(symbol,cmd, volume, price, slippage, 0, 0,
comment, magic, expiration, arrow_color); 
int check = -1; if (ticket > 0 && (stoploss != 0 || takeprofit != 0)) {
if (!OrderModify(ticket, price, stoploss, takeprofit,expiration, arrow_color)) {
check = GetLastError(); if (check != ERR_NO_ERROR) {
Print("OrderModify error: ", ErrorDescription(check)); } } } else {
check = GetLastError(); if (check != ERR_NO_ERROR){
Print("OrderSend error: ",ErrorDescription(check)); } } return (ticket); }
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
 
Виктор:
Саму функцию Кима надо разместить в самом конце кода, за пределами функции start().
При вызове она возвращает true, если согласно указанным в ее вызове параметрам торговля разрешена.
В первой строке специальной функции start() советника можно поместить следующую строку для разрешения торговли, например, между 22-30 и 23-35 серверного времени:

Скажите!! А можно как нить дать ему команду, запретить торговать между 22-30 и 23-35, а в остальное время что бы можно было?

 
Andrei Bucur:

Помогите мне пожалуйста тогда установить его правильно. вот код советника:

//+------------------------------------------------------------------+
//| Moving Average_Мodify.mq4                                        |
//| Copyright © 2009, MetaQuotes Software Corp.                      |
//| Modify by BARS                                                   |
//| >>>>>>>>>>>>> Correction 2018, forex-time@mail.ru <<<<<<<<<<<<<< |
//+------------------------------------------------------------------+
#define MAGICMA 20050610
//-----------------------------------------
extern int HourStart = 1;
extern int HourEnd = 23;
extern int StopLoss = 500;
extern int TakeProfit = 500;
extern double Lots = 0.1;
extern double MaximumRisk = 0.02;
extern double DecreaseFactor = 3;
extern double MovingPeriod_Open = 12;
extern double MovingPeriod_Close = 21;
extern double MovingShift = 1;

double SL,TP;
bool TimeWork=false;
//-- Подключаемые модули --
#include <stderror.mqh>
#include <stdlib.mqh>

//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
void start() {
//---- check for history and trading
//(если на графике есть более 100 баров и торговый поток свободен)
if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
//если расчитанный размер лота соответствует текущему размеру депозита
if(CalculateCurrentOrders(Symbol())==0)
CheckForOpen();// начинием работу
else CheckForClose();//в противном случае, - закрываем позиции
}
//жжжжжжжжжжжжжжжж Конец функции void start()жжжжжжжжжжжжжжжжжжжжжжж+ 

//жжжжжжжжжж Пользовательские функции жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
//| Функция определения наличия открытых позиций |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol) {
int buys=0,sells=0; for(int i=0;i<OrdersTotal();i++) {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++; }
}
//---- return orders volume
if(buys>0) return(buys); else return(-sells);
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
//| Функция расчета оптимального размера лота |
//+------------------------------------------------------------------+
double LotsOptimized() {
double lot=Lots;
int orders=HistoryTotal(); // history orders total
int losses=0; // number of losses orders without a break
//---- select lot size
lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
//---- calcuulate number of losses orders without a break
if(DecreaseFactor>0) {
for(int i=orders-1;i>=0;i--) {
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{ Print("Error in history!"); break; }
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
//----
if(OrderProfit()>0) break;
if(OrderProfit()<0) losses++;
}
if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
}
//---- return lot size
if(lot<0.1) lot=0.1;
return(lot);
}
//жжжжжжжжжжжж Функция открытия позиций жжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void CheckForOpen() {
double ma; int res;
if(Hour()==HourStart && !TimeWork) TimeWork=true;
if(Hour()==HourEnd && TimeWork) TimeWork=false;
//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//---- get Moving Average 
ma=iMA(NULL,0,MovingPeriod_Open,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//---- sell conditions
if(Open[1]>ma && Close[1]<ma && TimeWork) {
SL=0;TP=0;
if(StopLoss>0) SL=Bid+Point*StopLoss;
if(TakeProfit>0) TP=Bid-Point*TakeProfit; 
res=WHCOrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,SL,TP,
"Moving Average",MAGICMA,0,Red);
if(res < 0){Print("Ошибка открытия ордера SELL #", GetLastError()); 
Sleep(10000); return; }
}
//---- buy conditions
if(Open[1]<ma && Close[1]>ma && TimeWork){
SL=0;TP=0;
if(StopLoss>0) SL=Ask-Point*StopLoss;
if(TakeProfit>0) TP=Ask+Point*TakeProfit; 
res=WHCOrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,SL,TP,
"Moving Average",MAGICMA,0,Blue);
if(res < 0) { Print("Ошибка открытия ордера BUY #", GetLastError()); 
Sleep(10000); return; }
}
//----
}
//+жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
//| Функция закрытия позиций |
//+------------------------------------------------------------------+
void CheckForClose() {
double ma;
//---- go trading only for first tiks of new bar
//(с первым тиком нового бара начинаем работу)
if(Volume[0]>1) return;
//---- get Moving Average 
ma=iMA(NULL,0,MovingPeriod_Close,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//----
for(int i=0;i<OrdersTotal();i++) {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
//---- check order type 
if(OrderType()==OP_BUY) {
if(Open[1]>ma && Close[1]<ma) 
int cl=OrderClose(OrderTicket(),OrderLots(),Bid,3,White); break;
}
if(OrderType()==OP_SELL) {
if(Open[1]<ma && Close[1]>ma) 
cl=OrderClose(OrderTicket(),OrderLots(),Ask,3,White); break;
}
}
//---------------------
} 
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
//Функция предусмотрена Для открытие позиций в условиях рыночного 
//исполнения торговых заявок Market Watch
int WHCOrderSend(string symbol, int cmd, double volume,
double price, int slippage, double stoploss, 
double takeprofit, string comment,int magic, 
datetime expiration, color arrow_color)
{ int ticket = OrderSend(symbol,cmd, volume, price, slippage, 0, 0,
comment, magic, expiration, arrow_color); 
int check = -1; if (ticket > 0 && (stoploss != 0 || takeprofit != 0)) {
if (!OrderModify(ticket, price, stoploss, takeprofit,expiration, arrow_color)) {
check = GetLastError(); if (check != ERR_NO_ERROR) {
Print("OrderModify error: ", ErrorDescription(check)); } } } else {
check = GetLastError(); if (check != ERR_NO_ERROR){
Print("OrderSend error: ",ErrorDescription(check)); } } return (ticket); }
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
 

Этот вариант не будет работать если торговать надо ночью. Например с 23 вечера до 7 утра. 

В самом начале дали же Кимовский код используйте его!

 
Vitaly Gorbunov:

Этот вариант не будет работать если торговать надо ночью. Например с 23 вечера до 7 утра. 

Ну да.
Новые ограничения по времени исправил в коде, теперь будет работать.

 
if(Hour()==HourStart) TimeWork=true;
if(Hour()==HourEnd) TimeWork=false;

Тогда уж правильно будет вот так

if(Hour()==HourStart && !TimeWork) TimeWork=true;
if(Hour()==HourEnd && TimeWork) TimeWork=false;
Причина обращения: