[경고, 주제 닫힘!] 포럼을 어지럽히지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 당신 없이는 어디에도 없습니다. - 페이지 174

 
말해 주세요. 한 창(예: USDJPY)에 Expert Advisor가 있지만 특정 순간에 다른 열린 창에 화살표( ObjectCreate )를 넣으려면 AUDUSD, EURUSD 등의 전문가 고문이 필요합니다.
 
nicdevis >> :
말해 주세요. 한 창(예: USDJPY)에 Expert Advisor가 있지만 특정 순간에 다른 열린 창에 화살표( ObjectCreate )를 넣으려면 AUDUSD, EURUSD 등의 전문가 고문이 필요합니다.

ObjectCreate 도움말 을 살펴보면 지표나 Expert Advisor가 배치된 하나의 열린 차트 내에서만 작동한다는 것을 분명히 알 수 있습니다. 필요한 창에서 전역 변수나 파일을 통해 Expert Advisor로 데이터를 전송하는 방법이 있습니다.

 
granit77 >> :

ObjectCreate 도움말 을 살펴보면 지표나 Expert Advisor가 배치된 하나의 열린 차트 내에서만 작동한다는 것을 분명히 알 수 있습니다. 필요한 창에서 전역 변수나 파일을 통해 Expert Advisor로 데이터를 전송하는 방법이 있습니다.

즉, 어떤 식으로든 다른 창에서? 고맙습니다.

 

외부 변수 를 통해 이 보류 주문 수정 기능을 비활성화하는 방법은 무엇입니까?


 //+------------------------------------------------------------------+
//| Модификация ордеров                                              |
//+------------------------------------------------------------------+
void ModifyOrders ( ) {
   bool    fm ;
   double ldStop = 0 , ldTake = 0 ;
   int     spr = MarketInfo ( Symbol ( ) , MODE_SPREAD ) ;
   double pAsk = Ask + ( DistanceSet + spr ) * Point ;
   double pBid = Bid - DistanceSet * Point ;

   for ( int i = 0 ; i < OrdersTotal ( ) ; i + + ) {
     if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES ) ) {
       if ( OrderSymbol ( ) = = Symbol ( ) & & OrderMagicNumber ( ) = = MAGIC + 1 ) {
         if ( StopLoss ! = 0 ) ldStop = pAsk - StopLoss * Point ;
         if ( TakeProfit ! = 0 ) ldTake = pAsk + TakeProfit * Point ;
         OrderModify ( OrderTicket ( ) , pAsk , ldStop , ldTake , 0 , clModifyBuy ) ;
       }
       if ( OrderSymbol ( ) = = Symbol ( ) & & OrderMagicNumber ( ) = = MAGIC + 2 ) {
         if ( StopLoss ! = 0 ) ldStop = pBid + StopLoss * Point ;
         if ( TakeProfit ! = 0 ) ldTake = pBid - TakeProfit * Point ;
         OrderModify ( OrderTicket ( ) , pBid , ldStop , ldTake , 0 , clModifySell ) ;
       }
     }
   }
}

//+------------------------------------------------------------------+
//| Возвращает флаг существования ордера или позиции по номеру       |
//+------------------------------------------------------------------+
bool ExistOrder ( int mn ) {
   bool Exist = False ;
   for ( int i = 0 ; i < OrdersTotal ( ) ; i + + ) {
     if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES ) ) {
       if ( OrderSymbol ( ) = = Symbol ( ) & & OrderMagicNumber ( ) = = MAGIC + mn ) {
        Exist = True ; break ;
       }
     }
   }
   return ( Exist ) ;
}

//+------------------------------------------------------------------+
//| Возвращает флаг существования позиции по номеру                  |
//+------------------------------------------------------------------+
bool ExistPosition ( int mn ) {
   bool Exist = False ;
   for ( int i = 0 ; i < OrdersTotal ( ) ; i + + ) {
     if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES ) ) {
       if ( OrderSymbol ( ) = = Symbol ( ) & & OrderMagicNumber ( ) = = MAGIC + mn ) {
         if ( OrderType ( ) = = OP_BUY | | OrderType ( ) = = OP_SELL ) {
          Exist = True ; break ;
         }
       }
     }
   }
   return ( Exist ) ;
}
 
1Rakso писал(а) >>

외부 변수를 통해 보류 중인 주문을 수정하는 이 기능을 비활성화하는 방법은 무엇입니까?

 extern bool bModify = false ;
int start ( )
   if ( bModify ) ModifyOrders ( ) ;
   return ( 0 ) ;
}
뭔가 너무
 
Vinin >> :
뭔가 너무

고맙습니다! 비닌!

노력하다)

 
채널 고문

프로그래머가 도와줍니다. 이미 열려 있는 주문이 있더라도 어드바이저에서 주문을 열어야 합니다. 채널 어드바이저입니다. 라인을 터치할 때마다 해당 주문을 열어야 합니다. 그런 다음 하나의 주문이 열리고 닫힐 때까지 다른 주문이 열리지 않습니다. 미리 감사합니다.



//+------------------------------------------------------------------+
//| TradeChannel.mq4 |
//| Copyright © 2005, Yuri Makarov |
//| http://mak.tradersmind.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Yuri Makarov"
#property link "http://mak.tradersmind.com"

extern double Lots = 1.0;
extern int Slippage = 5;
extern int TimeOut = 10000;

double SetLevel(double Level, double NewLevel, string ObjName, int Style)
{
switch (Style)
{
case 1: // Buy Order line
ObjectSet(ObjName,OBJPROP_COLOR,Blue);
ObjectSet(ObjName,OBJPROP_STYLE,STYLE_SOLID);
ObjectSet(ObjName,OBJPROP_WIDTH,2);
break;
case 2: // Sell Order line
ObjectSet(ObjName,OBJPROP_COLOR,Red);
ObjectSet(ObjName,OBJPROP_STYLE,STYLE_SOLID);
ObjectSet(ObjName,OBJPROP_WIDTH,2);
break;
case 3: // Buy Stop line
ObjectSet(ObjName,OBJPROP_COLOR,Blue);
ObjectSet(ObjName,OBJPROP_STYLE,STYLE_DASH);
ObjectSet(ObjName,OBJPROP_WIDTH,1);
break;
case 4: // Sell Stop line
ObjectSet(ObjName,OBJPROP_COLOR,Red);
ObjectSet(ObjName,OBJPROP_STYLE,STYLE_DASH);
ObjectSet(ObjName,OBJPROP_WIDTH,1);
break;
case 5: // Buy Take line
ObjectSet(ObjName,OBJPROP_COLOR,Blue);
ObjectSet(ObjName,OBJPROP_STYLE,STYLE_DOT);
ObjectSet(ObjName,OBJPROP_WIDTH,1);
break;
case 6: // Sell Take line
ObjectSet(ObjName,OBJPROP_COLOR,Red);
ObjectSet(ObjName,OBJPROP_STYLE,STYLE_DOT);
ObjectSet(ObjName,OBJPROP_WIDTH,1);
break;
}

if (MathAbs(NewLevel - Close[0]) < MathAbs(Level - Close[0])) return (NewLevel);
else return (Level);
}

int start()
{
int NumObj = ObjectsTotal();
double Spread = Ask - Bid;

double pBuy = 0;
double pSell = 0;
double pBuyStop = 0;
double pBuyTake = 0;
double pSellStop = 0;
double pSellTake = 0;

for (int i = 0; i < NumObj; i++)
{
string ObjName = ObjectName(i);
string ObjDesc = ObjectDescription(ObjName);
double Price = 0;

switch (ObjectType(ObjName))
{
case OBJ_HLINE:
Price = ObjectGet(ObjName,OBJPROP_PRICE1);
break;
case OBJ_TREND:
Price = ObjectGetValueByShift(ObjName,0);
break;
}

if (Price > 0)
{
if (ObjDesc == "Buy") pBuy = SetLevel(pBuy, Price, ObjName, 1); else
if (ObjDesc == "Sell") pSell = SetLevel(pSell, Price, ObjName, 2); else
if (ObjDesc == "Stop")
{
if (Price < Close[0]) pBuyStop = SetLevel(pBuyStop, Price, ObjName, 3);
else pSellStop = SetLevel(pSellStop, Price, ObjName, 4);
} else
if (ObjDesc == "Take")
{
if (Price > Close[0]) pBuyTake = SetLevel(pBuyTake, Price, ObjName, 5);
else pSellTake = SetLevel(pSellTake, Price, ObjName, 6);
}
}
}

int NumOrders = OrdersTotal();
int NumPos = 0;

for (i = 0; i < NumOrders; i++)
{
OrderSelect(i, SELECT_BY_POS);
if (OrderSymbol() != Symbol()) continue;

NumPos++;

double tp = OrderTakeProfit();
double sl = OrderStopLoss();

if (OrderType() == OP_BUY)
{
if (Bid > pSell && pSell > 0)
{
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Red);
Sleep(TimeOut);
return(0);
}
if (MathAbs(tp - pBuyTake) > Spread || MathAbs(sl - pBuyStop) > Spread)
{
OrderModify(OrderTicket(), Ask, pBuyStop, pBuyTake, 0);
Sleep(TimeOut);
return(0);
}
}

if (OrderType() == OP_SELL)
{
if (Ask < pBuy)
{
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Red);
Sleep(TimeOut);
return(0);
}
if (MathAbs(tp - pSellTake) > Spread || MathAbs(sl - pSellStop) > Spread)
{
OrderModify(OrderTicket(), Bid, pSellStop, pSellTake, 0);
Sleep(TimeOut);
return(0);
}
}
}

if (NumPos > 0) return(0);
if ((pSell - pBuy) < Spread*2) return(0);

if (Bid > pSell && pSell > pBuyStop)
{
OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, pSellStop, pSellTake);
Sleep(TimeOut);
return(0);
}

if (Ask < pBuy && (pBuy < pSellStop || pSellStop == 0))
{
OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, pBuyStop, pBuyTake);
Sleep(TimeOut);
return(0);
}
}

int init()
{
return(0);
}

int deinit()
{
return(0);
}

 

아마도 이 줄이 당신을 차단하고 있을 것입니다:

if (NumPos > 0) return(0);

다음은 시작할 수 있는 방법입니다. 이것을 제거하십시오.

그리고 매수 및 매도 진입 메커니즘을 분리합니다. I. Kim의 기능을 사용하십시오(코드의 맨 끝에 삽입).





 //+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество позиций.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
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 ) ; }

그런 다음 구매 거래를 열기 위한 조건은 다음과 같습니다.



 if ( NumberOfPositions ( NULL , OP_BUY , -1 ) < 1 ) {
//если нет бай-позиций 



그리고 매도 조건은 다음과 같습니다.



 if ( NumberOfPositions ( NULL , OP_SELL , -1 ) < 1 ) {


 
RomanS писал(а) >>

이 문제는 아마도 2003년 이전에 해결되었을 것입니다. 하지만 다른 분들은 모르실 것 같아서 공유합니다))))

차트를 마우스 오른쪽 버튼으로 클릭 - 속성 선택 - 일반 탭 - 고정 눈금 확인란 선택 - 확인

다음으로 가격이 적힌 저울에 마우스를 대고 마우스 왼쪽 버튼을 누른 상태에서 마우스를 위/아래로 움직여 필요한 눈금을 조정합니다.

멀리 올라가지 않도록 이것을 메인 창으로 가져올 수 있습니까? 그렇지 않으면 올라가는 동안 시간을 잃기 때문에 MT 이용에 불편이 있습니다.

 
Synax >> :
채널 고문

프로그래머가 도와줍니다. 이미 열려 있는 주문이 있더라도 어드바이저에서 주문을 열어야 합니다. 채널 어드바이저입니다. 라인을 터치할 때마다 해당 주문을 열어야 합니다. 그런 다음 하나의 주문이 열리고 닫힐 때까지 다른 주문이 열리지 않습니다. 미리 감사합니다.



위 포스팅에서 설명드린대로 해봤습니다. 나는 위치 수의 f 번째를 삽입하고 끝의 위치를 여는 블록을 다음 블록으로 대체했습니다.

 //if (NumPos > 0) return(0);
if ( ( pSell - pBuy ) < Spread * 2 ) return ( 0 ) ;
//-------------------------------------------------
if ( NumberOfPositions ( NULL , OP_SELL , - 1 ) < 1 ) { //если нет открытых селл-позиций
if ( Bid > pSell & & pSell > pBuyStop )//если условия соответствуют заданным
{//продаем
OrderSend ( Symbol ( ) , OP_SELL , Lots , Bid , Slippage , pSellStop , pSellTake ) ;
Sleep ( TimeOut ) ;
return ( 0 ) ;
} }
//-----------------------------------------------------
if ( NumberOfPositions ( NULL , OP_BUY , - 1 ) < 1 ) { //если нет открытых бай-позиций
if ( Ask < pBuy & & ( pBuy < pSellStop | | pSellStop = = 0 ) )
{// покупаем
OrderSend ( Symbol ( ) , OP_BUY , Lots , Ask , Slippage , pBuyStop , pBuyTake ) ;
Sleep ( TimeOut ) ;
return ( 0 ) ;
} }

이제 고문은 동시에 최소 2개의 직위를 보유할 수 있습니다.

안타깝게도 작업을 확인할 수 없기 때문에 채널을 그리는 표시기를 부착하는 것을 잊었습니다.

파일: