Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 1067

 

Помогите, пожалуйста! Есть 2 файла: индикатора и советника. Как правильно обратиться к функции в индикаторе через #include? iCustom по разным причинам не подходит. Вот что написал в индикаторе:

 

bool BuyTrue(double& переменная, int переменная) export
{
   //тело функции

   return(true);
}   

 

А вот что в советнике:

#import "НазваниеИндикатора.ex4"
   bool BuyTrue(double& переменная, int переменная);
if (BuyTrue(переменная, переменная))
Opn_B = true;

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

 
AlexeyVik:

Тута.


А у меня нет такого. Но файл точно есть где то, я от туда получаю записанную информацию.


 

Помогите пожалуйста скомпилировать в мт4

Выдает ошибку 'FileClose' - expression of 'void' type is illegal TickToCVS~.mq4 84 12

Файлы:
 
abeiks:

А у меня нет такого. Но файл точно есть где то, я от туда получаю записанную информацию.


На моём скрине видно что менюшка из МетаЕдитора, а твой скрин из МТ.
 
AlexeyVik:

Это значение EMPTY_VALUE

Поищи где оно проскакивает.

Спасибо. Вы помогли мне решить проблему. У меня индикатор при загрузке рассчитывает бары начиная с первого, а не с нулевого (я специально так сделал), на нулевом он производит расчет на тиковой истории, а не на исторических данных. Теперь при смене таймфрейма, прикреплении к графику и перезагрузке терминала я обнуляю значения буферов на баре 0, проблема решена.
 
AlexeyVik:
На моём скрине видно что менюшка из МетаЕдитора, а твой скрин из МТ.
Точно! Спасибо!
 
Как получить цену открытие ордера в историй а не цену открытой позиций если этот ордер сработал? В приложенной функций если ордер сработал то этого ордера можно наитии только в позициях, поэтому не работает. А в позициях есть только цена открытой позиций а не ордера.
double GetPriceLastCloseOrder(string sy="", int mn=-1) {
  datetime t=0;
  int      i, k=OrdersHistoryTotal(); 
  double r=0;

  if (sy==NULL) sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if (OrderType()>1 && OrderType()<6) {
          if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            r=OrderOpenPrice();
          }
        }
      }
    }
  }
  return(r);
}  
 

всем здрасте.ребята вопрос;ника не могу модифицировать ордер.тут два аспекта,плохо представляю математику модификации,обьясните популярно плиз

в моем понимании SL= IF ORDERSELEKT,Bid-ORDERSTOPLOS*POINT,DIGITS

второй аспект.учился по XBMS видео

как я не пробовал изменить значения переменных в тестере ерор 130 не правильный стоп лос и такая вот херь

  2016.06.28 21:42:23.402 2016.06.23 00:00  торговля RSI inputs: Lots=0.1; Slippage=5; StopLoss=10; TakeProfit=30; RSIPeriod=7; Magic=1087; 

хотя есть и умножения от digits и функция на случай не верного SL 


 extern double Lots         = 0.1;

extern int    Slippage     = 10;

extern int    StopLoss     =10;

extern int    TakeProfit   =30; 

extern int    RSIPeriod    = 7;

extern int    Magic        =1087;

double MaRSI;


int  TP,SL;

bool tfu;


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

//| Expert initialization function                                   |

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

int OnInit()

{

   

    if(Digits == 3||Digits == 5)

    {

       Slippage    *= 10;

       TakeProfit  *= 10;

       StopLoss    *= 10;

    }  

   return(INIT_SUCCEEDED);

}

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

//| Expert deinitialization function                                 |

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

void OnDeinit(const int reason)

{


   

}

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

//| Expert tick function                                             |

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

void OnTick()

{

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

//открытие селл

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

    MaRSI=iRSI(Symbol(),0, RSIPeriod,PRICE_CLOSE,1);

 if(CountTrades() <= 0&&MaRSI<=30 )

  {

     if( SendOrder(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"тест",Magic,0,Green))

      {  int  ticket = OrderTicket(); 

         SL = NormalizeDouble( Ask - StopLoss*Point,Digits);

         TP = NormalizeDouble( Ask + TakeProfit*Point,Digits);

         ModifyOrder(ticket,OrderOpenPrice(),SL,TP,0,Black);

      }   

  }//   if(CountTrades <= 0&&MaRSI>=70 )   

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

//  открытие бай

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


}//ONTICK


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

//+счетчик ордеров

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


int CountTrades ()

{

     int count = 0;

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

     {

       if( OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

        {

           if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)//если ордер наш

              count++;//увеличиваем счетчик

        }//выбираем ордер по индексу

        

     }//фор.i==первому любому ордеру.

     

     return(count);//возвращает количество ордеров

}//функция

   

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

//функция установки ордеров с обработкой ошибок

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

int SendOrder(  string symbol,int cmd,double volume,double price,int slippage,double stoploss,

                double takeprofit,string comment,int magic=0,datetime expiration=0,color arrow_color=CLR_NONE) 

{

   int err = GetLastError();

   err =0;

   bool exit_cikl = false;

   int ticket = -1;

   

   int Retry = 10;//количество попыток установить ордер

   int cnt   = 0; //счетчик попыток

   

   if(cmd == OP_BUY || cmd == OP_SELL)

   {

        while(!exit_cikl)

        {

          ticket = OrderSend(symbol, cmd, volume, price, slippage, stoploss,takeprofit,comment, magic, expiration,arrow_color);

          err= GetLastError();

          

            switch(err)

            {

              case  ERR_NO_ERROR:

                    exit_cikl = true;

                    break;

                    

              case  ERR_SERVER_BUSY:

              case  ERR_NO_CONNECTION:

              case  ERR_INVALID_PRICE: 

              case  ERR_OFF_QUOTES:

              case  ERR_BROKER_BUSY:

              case  ERR_TRADE_CONTEXT_BUSY:

                    cnt++;

                    break;

                    

              case  ERR_PRICE_CHANGED:

              case  ERR_REQUOTE: 

                    RefreshRates();

                    continue;

                    

                    default:

                        exit_cikl = true;

                        break;     

            }//переключатель свич switch(err)

            

            if(cnt > Retry)

               exit_cikl = true;

               

             if(!exit_cikl)

              {

                Sleep(1000);

                RefreshRates();

              }//если не выходим из цикла     if(!exit_cikl)

              else

               {

                  if(err != ERR_NO_ERROR)

                   {

                      Print("Ошибка : " + IntegerToString(err));

                   }//если все же осталась какая то ошибка    if(err != ERR_NO_ERROR) 

               }//В ПРОТИВНОМ СЛУЧАЕ

               

               if(err==ERR_NO_ERROR)

                {

                  if( OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)==true)

                   return(ticket);

                }// if(err==ERR_NO_ERROR)

                

                Print("Ошибка открытия ордера после " + IntegerToString(cnt) +"попыток");

                return(-1);

           

        }//цикл while

   }//если тип ордера бай или сел

   return(ticket);

}//функция SendOrder


//-------------------------------------------------------------------------------------------------------------

//функция модифи ордер

//------------------------------------------------------------------------------------------------------------

bool ModifyOrder(int ticket, double price,double stoploss,double takeprofit,datetime expiration,color arrow_color)  

{

   if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

   {

     price      = NormalizeDouble(price,Digits);

     stoploss   = NormalizeDouble(stoploss,Digits);

     takeprofit = NormalizeDouble(takeprofit,Digits);

     CheckValidStop(Symbol(),price,stoploss);//функция изменения минимального стопа 

     

     int err = GetLastError();

     err = 0 ;

     

     int Retry = 10;

     int cnt   = 0;

     bool exit_cikl = false;

     bool result;

     

     while(!exit_cikl)

     {

       result = OrderModify(ticket, price,stoploss,takeprofit,expiration, arrow_color);

       err = GetLastError();

       

       if(result == true)

       {

         Print("Ордер № "+ IntegerToString(ticket), "успешно модифицирован");

         return(true);

       } 

        switch(err)

            {

              case  ERR_NO_ERROR:

                    exit_cikl = true;

                    break;

                    

              case  ERR_SERVER_BUSY:

              case  ERR_NO_CONNECTION:

              case  ERR_INVALID_PRICE: 

              case  ERR_OFF_QUOTES:

              case  ERR_BROKER_BUSY:

              case  ERR_TRADE_CONTEXT_BUSY:

                    cnt++;

                    break;

                    

              case  ERR_PRICE_CHANGED:

              case  ERR_REQUOTE: 

                    RefreshRates();

                    continue;

                    

                    default:

                        exit_cikl = true;

                        break;     

            }//переключатель свич switch(err)

 

        

     }//     while(!exit_cikl)

     

     if ( err != ERR_NO_ERROR)

     {

        Print("Ошибка модификации ордера № " + IntegerToString(ticket));

        Print("Код ошибки: " + IntegerToString(err));

     }

     

   }//if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

   else

   {

       Print("Не удалось выбрать ордер,ticket = " + IntegerToString(ticket));

       return(false);

   }//если что то не так

   return(true);

}//функция модифи

//----------------------------------------------------------------------------------------------------

//ChtckValidStop

//--------------------------------------------------------------------------------------------------

void CheckValidStop(string symbol,double price,double& sl)

{

  if(sl==0)

  return;

  

  double min_stop_server = MarketInfo(symbol,MODE_STOPLEVEL)*MarketInfo(symbol,MODE_POINT);

  if(MathAbs(price-sl) <= min_stop_server)

  {

     if(price>sl)

      sl = price - min_stop_server;

   else sl = sl + min_stop_server;   

  }///  if(MathAbs(price-sl) <= min_stop_server)     

  sl = NormalizeDouble(sl,MarketInfo(symbol,MODE_DIGITS));   

}//функция     


 

ПОДСКАЖИТЕ ПОЖАЛУЙСТА!!!

В торговой истории есть два ордера: 1) SELL №тик 415 STOPLOSS 1.1000 лот 0.01 2) SELL №тик 418 STOPLOSS 1.1000 лот 0.02

Мне нужно присвоить переменным: Х=№тик, У=STOPLOSS и В=лот если цена Аsk равна STOPLOSS ордера SELL. Как присвоить переменным сначала значения по первому ордеру а потом по второму. У меня всегда присваивает значение по первому.

 
m8akca:

ПОДСКАЖИТЕ ПОЖАЛУЙСТА!!!

В торговой истории есть два ордера: 1) SELL №тик 415 STOPLOSS 1.1000 лот 0.01 2) SELL №тик 418 STOPLOSS 1.1000 лот 0.02

Мне нужно присвоить переменным: Х=№тик, У=STOPLOSS и В=лот если цена Аsk равна STOPLOSS ордера SELL. Как присвоить переменным сначала значения по первому ордеру а потом по второму. У меня всегда присваивает значение по первому.

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

А если вы хотите, чтобы вам написали на заказ, то это туда.

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