[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 880

 
FoxUA:

да наверно я не точно выразился мне надо чтоб переменая скажем BalansEURUSD имела данные какой проф или убыток наданый момент в процентном соотнашении " BalansEURUSD =5%" дето так

и так по нескольким парам скажем еще по фунене и долорена

одно времено


это уже труднее, но посчитать можно:

для ордера SELL 

profit=NormalizeDouble((OrderOpenPrice()-Ask)*MarketInfo("EURUSD",MODE_TICKVALUE)*OrderLots()/Point,2);

margin=NormalizeDouble(AccountFreeMargin()-AccountFreeMarginCheck("EURUSD",OP_SELL,OrderLots(),2);

для BUY:

profit=NormalizeDouble((Bid-OrderOpenPrice())*MarketInfo("EURUSD",MODE_TICKVALUE)*OrderLots()/Point,2);

margin=NormalizeDouble(AccountFreeMargin()-AccountFreeMarginCheck("EURUSD",OP_BUY,OrderLots(),2);

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

 

Парни подскажите пожалуйста как сделать так чтобы при срабатывании одного отложенного ордера выставлялся другой ?????? Через ордер селект пробывал что то не получается ........
после
ордер тип == бай, // где бай ранше был байстоп
открыть ордер отложенник // (не открывает)

 
VOLDEMAR:

Парни подскажите пожалуйста как сделать так чтобы при срабатывании одного отложенного ордера выставлялся другой ?????? Через ордер селект пробывал что то не получается ........
после
ордер тип == бай, // где бай ранше был байстоп
открыть ордер отложенник // (не открывает)


как вариант, что первое пришло на ум  - через ордер селект в цикле по всем рыночным и отложенным ордерам  смотрите, есть ли в рынке рыночные ордера (бай или селл), если есть, значит отложенный ордер (ранее установленный) стал рыночным, то ставите очередной  (другой отложенный ордер какой вам надо, допустим: если ордер бай в рынке, то ставите байстоп и т.д.). Рекомендую почитать - 

 на сайте альпари - обучение форекс - учебник трейдера - автотрейдинг МКЛ4 (слева на панели) - торговые советники - (ф-ии ордерселект, ордерсенд, условные операторы и т.д.) 

http://www.alpari.ru/ru/school/textbook/autotrading/expert_advisors/ - лаконично и познавательно... 

 

Я пытаюсь научиться программировать.Подскажите,я подозреваю,что в советнике никогда не выполняется условие    

while (В*Point >zmm)
Comment("Значение разниці ", В);
OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-stoploss*Point,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
                                           

Как это обстоятельство можно проверить??Какие существуют методы?         И можно ли при неработающих тиках?
 

 

Уважаемые Эксперты! Учусь писать советник. Работает, но не все. Не работают блоки модификации и закрытия ордеров. Ни как не найду причину. Прошу помощи.

//+------------------------------------------------------------------+
//|                                                Monetny dvor1.mq4 |
//|                                                            fanat |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "fanat"
#property link      "http://www.metaquotes.net"

extern int TakeProfit=484; //
extern int StopLoss=89;    //
extern bool BStop=true;    //Включение безубытка
extern int Stop=90;        //            
//+------------------------------------------------------------
int start()
{//1
   
if(TakeProfit<10){Alert("Ошибка,Take слишком близко");return;}
if(StopLoss<10){Alert("Ошибка,StopLoss слишком близко");return;}
   
bool Buy=false;
bool Sell=false;
if(Close[0]>High[1])Buy=true;
if(Close[0]<Low[1])Sell=true;

int err;
int Order_Count[6];
int OP=-1;
ArrayInitialize(Order_Count,0);                             
         
for(int i=0;i<=OrdersTotal();i++)       //
  {//2                                   // Блок учета ордеров
   if(OrderSelect(i,SELECT_BY_POS)==true)//
    {//3                                 //
     Order_Count[OrderType()]++;         //
     if(OP!=-1)return(Order_Count[OP]);  //
    }//3
  }//2  
     if(OrdersTotal()>0)
      {//2
       if(BStop==true&&OrderOpenPrice()!=OrderStopLoss())                                                //Модификация ордеров
        {//3                                                                                             //
         if((OrderType()==0&&(Ask-OrderOpenPrice())>Stop)||(OrderType()==1&&(OrderOpenPrice()-Bid)>Stop))//
          {//4                                                                                           // 
           int ticket=OrderTicket();                                                                     // 
           double Price=OrderOpenPrice();                                                                //
           double SL=OrderOpenPrice();                                                                   //
           double TP=OrderTakeProfit();                                                                  //
           bool Ans=OrderModify(ticket,Price,SL,TP,0);                                                   //
           
           if(Ans==false){err=GetLastError();Alert(err);Sleep(500);return;}                              //Обработка ошибок
          }//4
        }//3
          
                                                                                                                                                                                                                                                                                                                                       // 
       if(OrderType()==1&&(Buy==true||Ask<OrderTakeProfit()||Bid>OrderStopLoss()))      //Условия закрытия ордеров Sell  
        {//3
         ticket=OrderTicket();                             //Закрытие ордеров Sell                                                                         
         double Lots=OrderLots();                          //
         OrderClose(ticket,Lots,Ask,4);                    //
         
         err=GetLastError();                               //Обработка ошибок 
         if(err>0){Alert(err);Sleep(500);return;}          //                                                                              
        }//3
                                                           
       if(OrderType()==0&&(Sell==true||Bid>OrderTakeProfit()||Ask<OrderStopLoss()))      //Условия закрытие ордеров Buy 
       {//3
         ticket=OrderTicket();                             //Закрытие ордеров Buy                   
         Lots=OrderLots();                                 //  
         OrderClose(ticket,Lots,Bid,4);                    //
          
         err=GetLastError();                               //Обработка ошибок
         if(err>0){Alert(err);Sleep(500);return;}          //
       }//3
      }//2 
                   
   if(Buy==false&&Sell==false)return;
   int Total=1;
   double Lot=0.03;                 
/*  if(AccountBalance()>400)Lot=0.04;          //
   if(AccountBalance()>500)Lot=0.05;          //
   if(AccountBalance()>600)Total=2;           //
   if(AccountBalance()>800)Lot=0.04;Total=2;  // Блок вычисления лота для реала
   if(AccountBalance()>1000)Lot=0.05;Total=2; //
   if(AccountBalance()>1200)Lot=0.04;Total=3; //
   if(AccountBalance()>1500)Lot=0.05;Total=3; //
   if(AccountBalance()>1600)Lot=0.04;Total=4; //
   if(AccountBalance()>1800)Lot=0.03;Total=6;*/ //
   
   Lot=0.1;
   if(AccountBalance()>1600)Lot=0.2;
   if(AccountBalance()>2400)Lot=0.3;
                                                                                      
   if(Order_Count[OP_BUY]<Total&&Order_Count[OP_SELL]==0&&Buy==true)                     //Открытие ордеров Buy
   {//2                                                                                  //
      OrderSend(Symbol(), OP_BUY, Lot, Ask, 4, Ask-StopLoss*Point, Ask+TakeProfit*Point);//
       
      err=GetLastError();                                                                //Обработка ошибок
      if(err>0){Alert(err);Sleep(500);}                                                  //
      return;
   }//2         
           
   if(Order_Count[OP_SELL]<Total&&Order_Count[OP_BUY]==0&&Sell==true)                     //Открытие ордеров Sell 
   {//2                                                                                   //
      OrderSend(Symbol(), OP_SELL, Lot, Bid, 4, Bid+StopLoss*Point, Bid-TakeProfit*Point);//
      
      err=GetLastError();                                                                 //Обработка ошибок
      if(err>0){Alert(err);Sleep(500);}                                                   //
   }//2
  
return;
}//1

омощи.

 
fanat:

Уважаемые Эксперты! Учусь писать советник. Работает, но не все. Не работают блоки модификации и закрытия ордеров. Ни как не найду причину. Прошу помощи.

омощи.


Может пора с функциями уже знакомиться?
 

вот проблема :

MathSrand(TimeLocal());

int periodRandom=period+ MathRand()/10000;
int period2Random=period2+ MathRand()/10000;

Moving1=iMA(Symbol(),0,periodRandom,0,MODE_SMA,price,1) ;

Moving2=iMA(Symbol(),0,period2Random,0,MODE_SMA,price,1);

Я решил менять случайным образом период машек - период плюс случайная величина от 0 до 3.

но в тестере прогонка показывает всегда одну величину прибыли. Возможно, период не меняется, Что я неправильно накодил?

 

Доброго времени суток! Вопрос простой: возможно ли каким-нибудь образом задать вторую размерность двумерного массива не через константу?

То есть, надо делать так: double massiv[5][5], а я хочу double massiv[5][k], где k - известная целая величина, заданная ранее, например, через extern int k = 5. Первую размерность можно изменить функцией ArrayResize, а вот вторую почему-то нельзя...

 
fru1t:

Доброго времени суток! Вопрос простой: возможно ли каким-нибудь образом задать вторую размерность двумерного массива не через константу?

То есть, надо делать так: double massiv[5][5], а я хочу double massiv[5][k], где k - известная целая величина, заданная ранее, например, через extern int k = 5. Первую размерность можно изменить функцией ArrayResize, а вот вторую почему-то нельзя...


#define k  5

 

https://docs.mql4.com/ru/basis/preprosessor/constant 

 

Здраствуйте, знатоки.

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

Мешает. 

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