Как исключить открытие еще одной позиции на текущем баре? Учитывая, что на этом баре уже открывались и закрывались. Вэтом плане нравиться строка из советника SHE kanskigor, но почему то не срабатывает TrStop. Или дайте ссылочку на какой-нибудь ресурс.
- Подмогните плз с написанием эксперта.
- Обсуждение статьи "Пошаговое руководство по написанию советников в MQL5 для начинающих"
- Помогите с кодом или скриптом
Вот здесь есть нужная вам функция 'Полезные функции от KimIV'
//+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 19.02.2008 | //| Описание : Возвращает номер бара открытия последней позиции или -1. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" или NULL - текущий символ) | //| tf - таймфрейм ( 0 - текущий таймфрейм) | //| op - операция ( -1 - любая позиция) | //| mn - MagicNumber ( -1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfBarOpenLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) { datetime t; int i, k=OrdersTotal(); if (sy=="" || sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (t<OrderOpenTime()) t=OrderOpenTime(); }} } } } } return(iBarShift(sy, tf, t, True)); }
А при открытии сделки предусматриваете дополнительное условие:
if (!NumberOfBarOpenLastPos(NULL, 0,-1, Magic) ==0) { //Условие реализует запрет более одной сделки на 1 баре
// Проверка условий для совершения сделки бай if (! NumberOfBarOpenLastPos(NULL, 0,OP_BUY, Magic) ==0) { //запрет неск. поз на одном баре //// тут условия на вход идут If.... // Проверка условий для совершения сделки селл if (! NumberOfBarOpenLastPos(NULL, 0,OP_SELL, Magic) ==0) { //запрет неск. поз на одном баре //// тут условия на вход идут If....
А вот это в конце кода...
//+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 19.02.2008 | //| Описание : Возвращает номер бара открытия последней позиции или -1. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" или NULL - текущий символ) | //| tf - таймфрейм ( 0 - текущий таймфрейм) | //| op - операция ( -1 - любая позиция) | //| mn - MagicNumber ( -1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfBarOpenLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) { datetime t; int i, k=OrdersTotal(); if (sy=="" || sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (t<OrderOpenTime()) t=OrderOpenTime(); }} } } } } return(iBarShift(sy, tf, t, True));
rid >>:
Вот здесь есть нужная вам функция 'Полезные функции от KimIV'
А при открытии сделки предусматриваете дополнительное условие:
Шустрый блин !
Пернатому привет !
Привет! Своему коту тож привет передавай!
Помогите исправить открытие ордера при пересечении 2х МА. А то он иногда открывает сразу несколько ордеров. Нужно чтоб открывал только один при пересечении.
Файлы:
Вставил функцию. Работу эксперта не проверял
И с закрытием позиций разберитесть. Что то не то там у вас...
#property copyright "Ron Thompson" #property link "http://www.lightpatch.com/forex" // User Input extern int Magic = 1122; extern double Lots=0.1; //---------------------------- int init() { return(0); } int deinit() { return(0); } //------------------------------ int start() { double cMAfst=0, pMAfst=0; double cMAslo=0, pMAslo=0; double MA100=0; int total=0; bool found=false; int otype=0; double otime=0; int cnt=0; // Error checking if(Bars<100){Print("bars less than 100");return(0); } if(AccountFreeMargin()<(1000*Lots)) {Print("We have no money"); return(0); } // only one order at a time/per symbol // so see if our symbol has an order open Comment("хи-хи, тра-ля-ля "); cMAfst=iMA(Symbol(),0,5 ,0,MODE_LWMA,PRICE_CLOSE, 1); pMAfst=iMA(Symbol(),0,5 ,0,MODE_LWMA,PRICE_CLOSE, 2); cMAslo=iMA(Symbol(),0,20,0,MODE_LWMA,PRICE_CLOSE, 1); pMAslo=iMA(Symbol(),0,20,0,MODE_LWMA,PRICE_CLOSE, 2); // rising or falling if ((pMAfst<=cMAslo && cMAfst>=cMAslo) || (pMAfst>=cMAslo && cMAfst<=cMAslo)) { // check for existing order found=false; otype=-1; total=OrdersTotal(); for(cnt=0;cnt<OrdersTotal();cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol()==Symbol()) { if(OrderOpenTime()>Time[3]) { found=true; otype=OrderType(); break; }}}} //--------------------------------------- if (found==true) { if (pMAfst<=cMAslo && cMAfst>=cMAslo && otype==1) //exist sell { OrderClose(OrderTicket(),Lots,Bid,0,Red); if (NumberOfPositions(NULL, OP_BUY,Magic)< 1) {//если нет бай позиций Print("BUY Order started ",Ask); OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"BC Buy ",Magic,0,White); if(GetLastError()==0)Comment("BC_BUY Order opened : ",Ask); }} if (pMAfst>=cMAslo && cMAfst<=cMAslo && otype==0) // exist buy { OrderClose(OrderTicket(),Lots,Ask,0,White); if (NumberOfPositions(NULL, OP_SELL,Magic)<1) {//если нет селл позиций Print("SELL Order started ",Bid); OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"BC Sell",Magic,0,Red); if(GetLastError()==0)Comment("BC_SELL Order opened : ",Bid ); }}} else // not found, so create { if (pMAfst<=cMAslo && cMAfst>=cMAslo) //rising { if (NumberOfPositions(NULL, OP_BUY,Magic)< 1) {//если нет бай позиций Print("BUY Order started ",Ask); OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"BC Buy ",Magic,0,White); if(GetLastError()==0)Comment("BC_BUY Order opened : ",Ask); }} if (pMAfst>=cMAslo && cMAfst<=cMAslo) //falling { if (NumberOfPositions(NULL, OP_SELL,Magic)<1) {//если нет селл позиций Print("SELL Order started ",Bid); OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"BC Sell",Magic,0,Red); if(GetLastError()==0)Comment("BC_SELL Order opened : ",Bid ); }} } return(0); } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+ //| Версия : 19.02.2008 | //| Описание : Возвращает количество позиций. | int NumberOfPositions(string sy="", int op=-1, int mn=-1) { int i, k=OrdersTotal(), kp=0; if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy || sy=="") { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) kp++; }}}}} return(kp); }
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь