Проблемы с проверкой открытой торговли - страница 5

 
BrotherPyrus:
Привет, Даз и Ко,

hothand работает на пятизначной MT4, но не на четырехзначной платформе.
Не могли бы вы уточнить, как именно он не работает?
 
BrotherPyrus:
hothand работает на пятизначной MT4, но не работает на четырехзначной платформе. Есть идеи, чем это вызвано, и подсказки, как это исправить?
Советники должны настраиваться на 4/5 цифр, TP, SL и проскальзывание. На ECN-брокерах вы должны сначала открыть, а ПОТОМ установить стопы.
//++++ These are adjusted for 5 digit brokers.
int     pips2points;    // slippage  3 pips    3=points    30=points
double  pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
int     Digits.pips;    // DoubleToStr(dbl/pips2dbl, Digits.pips)
int     init(){
    if (Digits == 5 || Digits == 3){    // Adjust for five (5) digit brokers.
                pips2dbl    = Point*10; pips2points = 10;   Digits.pips = 1;
    } else {    pips2dbl    = Point;    pips2points =  1;   Digits.pips = 0; }
    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
 
   if(iBarHour >= iOpenHour && iBarHour <= iOpenHour + iBarsToTrade && Tradeopen()==false) // Check if time is ok to trade & no trade is open
                  {

                          
                              //  if(High[2]>High[1] && Low[2]<Low[1]) // see if we have an inside bar
                                if(iHigh(hothand(), 60, 2)>iHigh(hothand(), 60, 1) && iLow(hothand(), 60, 2) < iLow(hothand(), 60, 1)) // see if we have an inside bar
                                 {                                                                                                     // on the hothand pair
                                           
                                        // IB found 
                                        if(iHigh(hothand(), 60, 1) > dDayOpenPrice) // IB high on hothand pair is greater than day open price bullish signal
                                          {
                                             int    buyspread=MarketInfo(hothand(),MODE_SPREAD);
                              double buyentry =  iHigh(hothand(), 60, 1) + 10 + buyspread;  //Low of prev bar + 1 pip + spread
                              double buystop = iLow(hothand(), 60, 1) - 10;    //Low of prev bar - 1 pip
                              double buytpx1 = iHigh(hothand(), 60, 1)+(iHigh(hothand(), 60, 1)-iLow(hothand(), 60, 1)); //1:1 r:r
                              double buytpx3 = iHigh(hothand(), 60, 1)+(iHigh(hothand(), 60, 1)-iLow(hothand(), 60, 1))*3; // 1:3 r:r
                              
                              
                           OrderSend(Symbol(),OP_BUY,1 , Ask, 3, buystop, buytpx1, "DIBSBUY", Mnumber1);  //Open buy order
                           OrderSend(Symbol(),OP_BUY,1 , Ask, 3, buystop, buytpx3, "DIBSBUY", Mnumber3);
                            }
                            
                         if(iLow(hothand(), 60, 1) < dDayOpenPrice) // IB low on hothand pair is lower than day open price bearish signal
                            {
                              int    sellspread=MarketInfo(hothand(),MODE_SPREAD);
                              double sellentry = iLow(hothand(), 60, 1)-10; //Low of prev bar - 1 pip 
                              double sellstop = iHigh(hothand(), 60, 1)+ 10 + sellspread; // High of prev bar + 1 pip + Spread
                              double selltpx1 = iLow(hothand(), 60, 1)-(iHigh(hothand(), 60, 1)- iLow(hothand(), 60, 1)); //1:1 r:r
                              double selltpx3 = iLow(hothand(), 60, 1)-(iHigh(hothand(), 60, 1)- iLow(hothand(), 60, 1))*3; // 1:3 r:r
                              
                              
                           OrderSend(Symbol(),OP_SELL,1 , Ask, 3, sellstop, selltpx1,"DIBSSELL",Mnumber1);  //Open Sell Order
                           OrderSend(Symbol(),OP_SELL,1 , Ask, 3, sellstop, selltpx3,"DIBSSELL",Mnumber3);  //Open Sell Order
               
                                      } 
                        }
                               
                   }
     //  
  
    
      }

Хорошо, я вернулся,


Это та часть моего кода, где выполняются сделки, я просто собираюсь работать с 5 цифрами на данный момент. Идея заключается в том, что я использовал функцию hothand для выбора пары, которой лучше торговать в течение дня. Этот код должен сканировать внутренний бар на часовом графике. (Функция hothand возвращает строку пары) Когда он находит внутренний бар, я просто заставил его открыть сделку на покупку или продажу в целях тестирования. Я не уверен, может ли бэктестер обрабатывать торговлю несколькими парами с одного графика? Я загрузил 1-минутную историю для всех пар, которые он использует. Но, похоже, он открывает сделки только на eurusd, к которому я прикрепил график,

WHRoeder спасибо, что заглянули и помогли еще раз. Итак, правильный ли способ открыть сделку с помощью ea - открыть ее, а затем вернуться и заполнить sl и tp после того, как она открылась? Я уверен, что вы сможете найти миллион ошибок в этом коде.

 
  1. OrderSend(Symbol(),OP_BUY,1 , Ask, 3, buystop, buytpx1, "DIBSBUY", Mnumber1);  //Open buy order
    

    Не регулирует проскальзывание для 4/5 цифр. Не совместим с ECN

    Всегда тестируйте коды возврата, чтобы выяснить, ПОЧЕМУ они не работают.

    int ticket = OrderSend(Symbol(),OP_BUY,1 , Ask, 3, buystop, buytpx1, "DIBSBUY", Mnumber1);  //Open buy order
    if (ticket < 0) Alert("OrderSend [1] failed: ",GetLastError());

  2. buystop = iLow(hothand()...
    Ваши стопы основаны на паре hothand(), но вы открываете ордер с помощью Symbol(). Если они не совпадают, то стопы полностью ошибочны.
 
dazamate:

Хорошо, я вернулся,


Это та часть моего кода, где выполняются сделки, я просто собираюсь работать с 5 цифрами на данный момент. Идея заключается в том, что я использовал функцию hothand для выбора пары, которой лучше торговать в течение дня. Этот код должен сканировать внутренний бар на часовом графике. (Функция hothand возвращает строку пары) Когда он находит внутренний бар, я просто заставил его открыть сделку на покупку или продажу в целях тестирования. Я не уверен, может ли бэктестер обрабатывать торговлю несколькими парами с одного графика? Я загрузил 1-минутную историю для всех пар, которые он использует. Но, похоже, он открывает сделки только на eurusd, к которому я прикрепил график,


Некоторые общие комментарии:

вы покупаете по Ask и продаете по Bid.

если ваш брокер является брокером типа ECN, вы не можете установить SL и TP при размещении ордера (в этом случае установите их на 0), вы должны разместить ордер, затем модифицировать ордер, чтобы добавить SL и TP

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

если вы планируете использовать этот советник на нескольких графиках, т.е. выставлять ордера с нескольких графиков, вам понадобится некий мьютекс, чтобы избежать перегрузки контекста ордера (посмотрите сообщения WHRoeder, у него есть отличный мьютекс).

 
Damm WHRoeder, вы правы "наши стопы основаны на паре hothand(), но вы открываете ордер с помощью Symbol()" Я этого не заметил. Как глупо. Все это так утомляет, пока ты пытаешься это выучить. Но да, глупо. Спасибо, что разобрались в этом бардаке. Я, вероятно, сделаю перерыв и вернусь завтра с освобожденной головой. Я исправлю те вещи, на которые вы указали.
 
dazamate:

Но, похоже, он открывает сделки только на eurusd - графике, к которому я его прикрепил,

Да, . . .

OrderSend(Symbol(),OP_SELL,1 , Ask, 3, sellstop, selltpx1,"DIBSSELL",Mnumber1);  //Open Sell Order

Symbol () - это пара, к которой прикреплен советник/индикатор, вы хотели сделать это вместо него?

OrderSend(hothand(),OP_SELL,1 , Ask, 3, sellstop, selltpx1,"DIBSSELL",Mnumber1);  //Open Sell Order
 

Да, я действительно собирался это сделать, но теперь я получаю эту ошибку


http://clip2net.com/s/144hq


Как будто она не распознает парный вывод функции hothand. Выход функции hothand - это строка, поэтому я не понимаю, почему она не работает.

 
dazamate:
Как будто он не распознает парный вывод функции hothand. Выход функции hothand - это строка, поэтому я не понимаю, почему она не работает.
OrderSend(hothand(),OP_SELL,1 , Ask, 3, sellstop, selltpx1,"DIBSSELL",Mnumber1);  //Open Sell Order
  1. Ask/Bid - это текущая цена Symbol(), но вы пытаетесь открыть другую пару. Ложная цена.
  2. Вы не можете получить значения нулевого бара из тестера для других ТФ/пар
  3. Вы не можете открывать сделки по другим парам в тестере, IIRC
  4. неизвестное имя символа USDCHF для функции OrderSend
    Откуда вы берете эту строку? Является ли текущий график тем же самым шаблоном, или USD,EUR, или USD/EUR, или USDEURm, или USDEURfxf и т.д.
  5. Я предлагаю вам торговать ТОЛЬКО текущей парой. Если hothand() не является текущей, никаких сделок. Так он будет работать в тестере, вы всегда сможете поставить советника на другие пары, контролируя, какие пары он торгует, и вы избежите всех подводных камней.
 

Привет всем, я пытаюсь сделать код, который делает следующее


extern string  sComment4                = "Max Hours allowed before pending orders are deleted";
extern int     pendinglimit        = 4;

// * EVERYTIME A TRADE GETS TRIGGERED 

bartraded = TimeHour(TimeCurrent());


// DELETE PENDING ORDERS THAT HAVE NOT BEEN TRIGGERED WITHIN 

   if(TimeHour(TimeCurrent()) > bartraded + pendinglimit && Tradeopen()==true) // Check to see if pending orders have expired
     {
        for(int tnumber = OrdersTotal()-1; tnumber >= 0 ; tnumber--)  //scan through open orders
        {
          if (OrderSelect(tnumber, SELECT_BY_POS) &&   
           OrderType()==(OP_BUYSTOP||OP_SELLSTOP) &&     // The order selected is either a pending buy on stop order or a buy on sell order
            OrderMagicNumber()==(Mnumber1||Mnumber3))    // The orders magic number is the same as the magic number used in this ea
          
               {
                OrderSelect(tnumber, SELECT_BY_POS);     // Select order
                OrderDelete(tnumber);                    // Delete it
               }
        }
     }

Если отложенный ордер был открыт в течение x количества баров, удалить его, если количество баров превысило x.


Может быть, что-то не так с моей логикой?

Причина обращения: