Написал советник. У того кому писал, при первом запуске открывает две позиции сразу одна за другой. У себя такой проблемы воспроизвести не могу. Прошу помощи.
За открытие позиций отвечает только функция CheckForOpen(), вот она:
enum opp_mode {
DoClose, // Close and reverse with initial lot
DoReverse, // Close and reverse (continue Martingale last lot)
DoHedge, // No closing reversal (Hedge mode)
};
// Trade & MM Sectioninput opp_mode Mode_opp = DoHedge; // Trading Mode//+------------------------------------------------------------------+//| Check for Open function |//+------------------------------------------------------------------+void CheckForOpen() {
if (!IsBarNew) return;
double lot=0;
positions=Positions();
if (Signal==OP_BUY) {
if (longs>0) return;
if (shorts==0) { // First Order PlacingPrint(" *** MSG *** "+msg);
PlaceMarketOrder(OP_BUY, Lot, _ask, _SL, _TP);
}
if (shorts>0) {
if (Mode_opp==DoClose) { // Closing by Opposite SignalPrint(" *** MSG *** "+msg);
Print(" *** Close mode SELL by opposite signal.");
ClosePositions(OP_SELL);
PlaceMarketOrder(OP_BUY, Lot, _ask, _SL, _TP);
}
if (Mode_opp==DoReverse) { // Reverse by Opposite SignalPrint("Reversing SELL by opposite signal.");
lot=GetMaxLot(ORDER_TYPE_SELL);
if (IsMartingale) lot=lot*LotMult;
ClosePositions(OP_SELL);
PlaceMarketOrder(OP_BUY, lot, _ask, _SL, _TP);
}
if (Mode_opp==DoHedge) { // Hedging by Opposite SignalPrint("Hedging SELL by opposite signal.");
MartinCounterB=50; MartinCounterS=50;
PlaceMarketOrder(OP_BUY, GetMaxLot(ORDER_TYPE_SELL)*LotMult, _ask, _SL, _TP);
}
}
}
if (Signal==OP_SELL) {
if (shorts>0) return;
if (longs==0) { // First Order PlacingPrint(" *** MSG *** "+msg);
PlaceMarketOrder(OP_SELL, Lot, _bid, _SL, _TP);
}
if (longs>0) {
if (Mode_opp==DoClose) { // Closing by Opposite SignalPrint(" *** MSG *** "+msg);
Print(" *** Close mode BUY by opposite signal.");
ClosePositions(OP_BUY);
PlaceMarketOrder(OP_SELL, Lot, _bid, _SL, _TP);
}
if (Mode_opp==DoReverse) { // Reverse by Opposite SignalPrint("Reversing BUY by opposite signal.");
lot=GetMaxLot(ORDER_TYPE_BUY);
if (IsMartingale) lot=lot*LotMult;
ClosePositions(OP_BUY);
PlaceMarketOrder(OP_SELL, lot, _bid, _SL, _TP);
}
if (Mode_opp==DoHedge) { // Hedging by Opposite SignalPrint("Hedging BUY by opposite signal.");
MartinCounterB=50; MartinCounterS=50;
PlaceMarketOrder(OP_SELL, GetMaxLot(ORDER_TYPE_BUY)*LotMult, _bid, _SL, _TP);
}
}
}
}
//+------------------------------------------------------------------+
Функция, отправляющая запрос на открытие позиции с рынка. Добавил в нее повтор с задержкой при отказе сервера т.к. при тестировании на MetaQuotes MT5 demo очень часто получал requotes/offquotes.
//+------------------------------------------------------------------+//| Place Market Order function |//+------------------------------------------------------------------+bool PlaceMarketOrder(int oper, double lot, double oop, double sl, double tp) { // mn - Magic Numberdouble d_sl=0, d_tp=0;
MqlTick stTick;
if (SymbolInfoTick(_Symbol,stTick)==false) {
Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
}
Print("Placing market order. Type="+(string)oper+", OrderOpenPrice="+DoubleToString(oop,_Digits)+
", Bid="+DoubleToString(_bid,_Digits)+", Ask="+DoubleToString(_ask,_Digits));
if (MathAbs(lot-Lot)<1e-5) {MartinCounterB=0; MartinCounterS=0;}
if (oper==OP_BUY) {
for (int i=0; i<5; i++) {
if (SymbolInfoTick(_Symbol,stTick)==false) {
Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
}
_ask=stTick.ask;
d_sl=ND(_ask-sl*pips); if (MathAbs(sl)<1e-5) d_sl=ND(0.0);
d_tp=ND(_ask+tp*pips); if (MathAbs(tp)<1e-5) d_tp=ND(0.0);
if (m_trade.Buy(NormalizeLot(lot),NULL,_ask,d_sl,d_tp,Comm)) {PlaySound("expert.wav"); return(true);}
else {PlaySound("disconnect.wav"); Sleep(5000);}
}
}
if (oper==OP_SELL) {
for (int i=0; i<5; i++) {
if (SymbolInfoTick(_Symbol,stTick)==false) {
Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
}
_bid=stTick.bid;
d_sl=ND(_bid+sl*pips); if (MathAbs(sl)<1e-5) d_sl=ND(0.0);
d_tp=ND(_bid-tp*pips); if (MathAbs(tp)<1e-5) d_tp=ND(0.0);
if (m_trade.Sell(NormalizeLot(lot),NULL,_bid,d_sl,d_tp,Comm)) {PlaySound("expert.wav"); return(true);}
else {PlaySound("disconnect.wav"); Sleep(5000);}
}
}
return(false);
}
//+------------------------------------------------------------------+
Функция контроля открытия нового бара:
//+------------------------------------------------------------------+//| Global Variables |//+------------------------------------------------------------------+bool IsBarNew=false;
//+------------------------------------------------------------------+//| Bar refreshing function |//| true - new bar opened, false - not opened |//+------------------------------------------------------------------+bool IsNewBar() {
staticdatetime SavedTime=iTime(NULL,PERIOD_CURRENT,0);
datetime curTime =iTime(NULL,PERIOD_CURRENT,0);
if (curTime>SavedTime) {
SavedTime=curTime;
return(true);
}
elsereturn(false);
}
//+------------------------------------------------------------------+
Вторая позиция открывается сразу же после первой, в ту же секунду, тикеты различаются на единицу. Изначально предполагал что висит вторая копия советника на втором графике, попросил закрыть все, оставить один график и запустить советник, но по словам и судя по скриншоту заказчика причина не в этом. Последующие позиции открываются по одной, больше дуплетов нет. Воспроизвести не могу, уже голову сломал об это. Тестирую как и заказчик на МТ5 демо ICMarkets hedge. Скриншот дуплета.
Написал советник. У того кому писал, при первом запуске открывает две позиции сразу одна за другой. У себя такой проблемы воспроизвести не могу. Прошу помощи.
Функция OnTick()
За открытие позиций отвечает только функция CheckForOpen(), вот она:
Функция, отправляющая запрос на открытие позиции с рынка. Добавил в нее повтор с задержкой при отказе сервера т.к. при тестировании на MetaQuotes MT5 demo очень часто получал requotes/offquotes.
Функция контроля открытия нового бара:
Вторая позиция открывается сразу же после первой, в ту же секунду, тикеты различаются на единицу. Изначально предполагал что висит вторая копия советника на втором графике, попросил закрыть все, оставить один график и запустить советник, но по словам и судя по скриншоту заказчика причина не в этом. Последующие позиции открываются по одной, больше дуплетов нет. Воспроизвести не могу, уже голову сломал об это. Тестирую как и заказчик на МТ5 демо ICMarkets hedge. Скриншот дуплета.
Весь советник.
Я использую такую функцию для контроля нового бара - бывает, что имеются ошибки при копировании даты бара.
//+------------------------------------------------------------------------------------------------------------------+//| Возвращает TRUE, если появился новый бар на текущем ТФ//+------------------------------------------------------------------------------------------------------------------+bool isNewBar()
{
datetime tm[];
staticdatetime prevBarTime=0;
if(CopyTime(_Symbol,0,0,1,tm)<0)
{
Print("%s CopyTime error = %d",__FUNCTION__,GetLastError());
}
else
{
if(prevBarTime!=tm[0])
{
prevBarTime=tm[0];
returntrue;
}
returnfalse;
}
returntrue;
}
Vladimir Karputov
В кодобазе был ваш советник который удалял отложки спустя определенное количество баров.
Не могу найти
Ребятки помогите...
советник работает но при попытке его открыть в эдиторе отображаются крякозябры...
что делать?
䝛⾞䐅仑䦝ꯗ巛瘀З首䑴뚹魠ʱ퐎⻮헨옡嵎ꧪ鵞瞌ָ施㨉죌ガബ漾ො싯ͮ啤쇧븸趉⛹븼欓렼쥳딡ⳤ镤貄╘薞䪬弴㑏ⱝ⺘ܱ▙ॵ䴓ԕ䡵뇉찒婓뽝啛꽝慕룋ଅ謈酹峅ʡ뀓區뵵ꬕ�䂺券衔嘅圔或㨣ꃝ杙ꮨ锶㇌ꪸ荒᷹�㤔䗭畝ڽ疾솮䎼5а там должно быть пару тысяч строк кода...
Ребятки помогите...
советник работает но при попытке его открыть в эдиторе отображаются крякозябры...
что делать?
а там должно быть пару тысяч строк кода...
Открой в редакторе любой файл .exe и прочитай хоть пару строк кода, которые в нём написаны...
Открой в редакторе любой файл .exe и прочитай хоть пару строк кода, которые в нём написаны...
это не экзешник, а mq5 файл...
это мой код...
......
советник работает но при попытке его открыть в эдиторе
......
это не экзешник, а mq5 файл...
это мой код...
Ну так правильно формируйте фразы.
По теме. Я обычно открываю такие проблемные в Notepad++. Помогает. Но не всегда )))
Ну так правильно формируйте фразы.
По теме. Я обычно открываю такие проблемные в Notepad++. Помогает. Но не всегда )))
вот и я в нехт редакторе решил просмотреть, а там почти одни нули, хотя размер у файла был нормальный как и должен быть...
Написал советник. У того кому писал, при первом запуске открывает две позиции сразу одна за другой. У себя такой проблемы воспроизвести не могу. Прошу помощи.
Функция OnTick()
За открытие позиций отвечает только функция CheckForOpen(), вот она:
Функция, отправляющая запрос на открытие позиции с рынка. Добавил в нее повтор с задержкой при отказе сервера т.к. при тестировании на MetaQuotes MT5 demo очень часто получал requotes/offquotes.
Функция контроля открытия нового бара:
Вторая позиция открывается сразу же после первой, в ту же секунду, тикеты различаются на единицу. Изначально предполагал что висит вторая копия советника на втором графике, попросил закрыть все, оставить один график и запустить советник, но по словам и судя по скриншоту заказчика причина не в этом. Последующие позиции открываются по одной, больше дуплетов нет. Воспроизвести не могу, уже голову сломал об это. Тестирую как и заказчик на МТ5 демо ICMarkets hedge. Скриншот дуплета.
Весь советник.
Написал советник. У того кому писал, при первом запуске открывает две позиции сразу одна за другой. У себя такой проблемы воспроизвести не могу. Прошу помощи.
Функция OnTick()
За открытие позиций отвечает только функция CheckForOpen(), вот она:
Функция, отправляющая запрос на открытие позиции с рынка. Добавил в нее повтор с задержкой при отказе сервера т.к. при тестировании на MetaQuotes MT5 demo очень часто получал requotes/offquotes.
Функция контроля открытия нового бара:
Вторая позиция открывается сразу же после первой, в ту же секунду, тикеты различаются на единицу. Изначально предполагал что висит вторая копия советника на втором графике, попросил закрыть все, оставить один график и запустить советник, но по словам и судя по скриншоту заказчика причина не в этом. Последующие позиции открываются по одной, больше дуплетов нет. Воспроизвести не могу, уже голову сломал об это. Тестирую как и заказчик на МТ5 демо ICMarkets hedge. Скриншот дуплета.
Весь советник.
Я использую такую функцию для контроля нового бара - бывает, что имеются ошибки при копировании даты бара.