포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 1100

 

친애하는 프로그래머 여러분, 동시에 두 개 이상의 거래 시리즈를 여는 것을 금지하는 데 도움을 주십시오(시리즈는 주문이 손실 또는 0으로 마감된 다음 동일한 상품에 대해 다음 거래가 열리는 경우이지만 즉, 한 시리즈의 거래가 두 번째로 열리고 후속 거래가 다른 도구에 대해 금지되는 경우(봇이 동시에 다른 도구에서 작동함). 이건 터미널의 전역 변수를 통해서 해야 한다고 생각하는데, 지식과 경험이 부족해서 최근에 MQL 을 배우기 시작했습니다. 이것은 바이너리 옵션 조언자입니다. 다음은 코드입니다.

extern 이중 로트 = 1; // 많은

외부 intExp = 1; // 만료

extern int 대기 = 1; // 한 방향의 촛불 개수

extern int 시간 초과 = 1; // 시간 간격

extern 이중 승수 = 3; // 승수

extern int 미끄러짐 = 5; // 미끄러짐

외부 정수 매직 = 2090; // 마법


int 티켓, 유형;

두 배 가격, 많은;

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

//| 전문가 초기화 기능 |

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

int OnInit()

{

반환(INIT_SUCCESSED);

}

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

//| 전문적인 초기화 해제 기능 |

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

무효 OnDeinit(const int 이유)

{

}

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

//| 전문가 틱 기능 |

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

무효 OnTick()

{

// --------------- 거래 시작 ---------------

if (OrdersTotal() == 0) // 주문 수는 0과 같아야 합니다.

{

if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))

// 마지막 거래가 수익성이 없으면 같은 거래가 열리지만 로트가 증가합니다.

{

유형 = TypeLastHistOrder();

if (유형 == OP_BUY) 가격 = 묻기;

if (유형 == OP_SELL) 가격 = 입찰가;

로트 = NormalizeDouble(LotsLastHistOrder()*승수, 2);

티켓 = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)

// 마지막 거래의 이익이 0이면 동일하게 엽니다.

{

유형 = TypeLastHistOrder();

if (유형 == OP_BUY) 가격 = 묻기;

if (유형 == OP_SELL) 가격 = 입찰가;

많은 = NormalizeDouble(LotsLastHistOrder(), 2);

티켓 = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))

|| CountHistTrades() == 0)// 마지막 거래가 수익성이 있으면 주문이 열립니다.

{

if (SignalBuy() && OrdersTotal() == 0)

{

티켓 = OrderSend(Symbol(), OP_BUY, lot, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

if (SignalSell() && OrdersTotal() == 0)

{

티켓 = OrderSend(Symbol(), OP_SELL, 랏, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);

댓글("PriceCloseLastHistOrder(OP_BUY)= ", PriceCloseLastHistOrder(OP_BUY), "PriceCloseLastHistOrder(OP_SELL)=",

PriceCloseLastHistOrder(OP_SELL) );

}

}

}

}

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

int CountTrades(int type = -1) // 거래 횟수 결정

{

정수 cnt = 0;

for (int i=OrdersTotal()-1; i>=0; i--) // 루프는 절대적으로 모든 미결 주문을 통과합니다. i -- 주문의 일련 번호

{

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) // 함수는 시장에 서수 i의 주문이 있는지 확인합니다.

// 그렇다면 다음 조건을 확인합니다 ...

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1)) // Symbol인 경우,

// 주문이 열리는 곳은 현재 기호와 동일하며 주문의 마법은 현재 고문의 설정에 있는 마법과 같습니다.

// 주문 유형은 값 유형과 같음(또는 유형 == -1(주문을 계산하는 데 필요한 유형이 중요하지 않은 경우))

cnt++; // cnt 변수에 1이 추가되고 주기가 끝나면 cnt는 이미 거래 수와 같게 됩니다.

// 특정 유형의 현재 통화 쌍에 대해 현재 고문이 열었습니다.

}

}

리턴(cnt); // 변수 cnt의 값을 반환

}

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

int CountHistTrades(int 유형 = -1)

{

정수 cnt = 0;

(int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == 유형 || 유형 == -1))

cnt++;

}

}

리턴(cnt);

}

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

bool SignalBuy()

{

for (int i=1; i<=대기; i++)

{

if (닫기[i] > 열기[i]) return(false);

}

if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= 대기 || (대기 == 0 && TimeCurrent() >= TimeLastHistOrder()+시간 초과))

&& CountHistTrades() > 0) return(true);

if (CountHistTrades() == 0) return(true);

반환(거짓);

}

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

bool SignalSell()

{

for (int i=1; i<=대기; i++)

{

if (닫기[i] < 열기[i]) return(false);

}

if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= 대기 || (대기 == 0 && TimeCurrent() >= TimeLastHistOrder()+시간 초과))

&& CountHistTrades() > 0) return(true);

if (CountHistTrades() == 0) return(true);

반환(거짓);

}

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

날짜/시간 TimeLastHistOrder(int 유형 = -1)

{

날짜 시간 마지막 시간 = 0;

날짜 시간 오픈 시간 = 0;


(int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == 유형 || 유형 == -1))

{

if (OrderCloseTime() > 마지막 시간)

{

마지막 시간 = OrderCloseTime();

오픈타임 = 주문오픈타임();

}

}

}

}

반환(오픈 시간);

}

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

intTypeLastHistOrder()

{

날짜 시간 = 0;

정수 유형 = -1;

(int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

{

if (OrderCloseTime() > 시간)

{

시간 = OrderCloseTime();

유형 = 주문 유형();

}

}

}

}

반환(유형);

}

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

이중 LotLastHistOrder(int 유형 = -1)

{

날짜 시간 = 0;

이중 로트 = 0;

(int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == 유형 || 유형 == -1))

{

if (OrderOpenTime() > 시간)

{

시간 = OrderOpenTime();

제비 = OrderLots();

}

}

}

}

반환(많은);

}

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

두 배 PriceCloseLastHistOrder(int 유형 = -1)

{

날짜 시간 = 0;

이중 가격 = 0;

(int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == 유형 || 유형 == -1))

{

if (OrderCloseTime() > 시간)

{

시간 = OrderCloseTime();

가격 = OrderClosePrice();

}

}

}

}

반품(가격);

}

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

두 배 PriceOpenLastHistOrder(int 유형 = -1)

{

날짜 시간 = 0;

이중 가격 = 0;

(int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == 유형 || 유형 == -1))

{

if (OrderCloseTime() > 시간)

{

시간 = OrderCloseTime();

가격 = OrderOpenPrice();

}

}

}

}

반품(가격);

}

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

 
안녕 동료들!

프로그래밍할 때 질문이 있었습니다. 어떻게든 Expert Advisor 에서 밀리초의 정확도로 서버 시간 을 얻을 수 있습니까?
예를 들어, 다음을 얻습니다. 09/23/2016 14h. : 53분 : 54000밀리초? 정확히 54초, 000m/sec입니다.
 
e-partner :
안녕 동료들!

프로그래밍할 때 질문이 있었습니다. 어떻게든 Expert Advisor 에서 밀리초의 정확도로 서버 시간 을 얻을 수 있습니까?
예를 들어, 우리는 09/23/2016 14h를 얻습니다. : 53분 : 54000밀리초? 정확히 54초, 000m/sec입니다.

관심 문의. 서버의 마지막 알려진 시간, 마지막 견적 TimeCurrent()의 도착 시간 또는 서버의 현재 시간을 지정한다는 것은 무엇을 의미합니까?

TimeCurrent()인 경우, 새로운 인용이 있는 패킷이 인터넷을 통해 10-500ms 내에 서버에서 터미널로 이동하고 이 시간이 패킷마다 다르다는 점을 감안할 때 이것의 용도는 무엇입니까? 또한 마지막 견적의 도착이 무엇인지 확실하지 않습니다. 여러 출처, 유동성 공급자에서 서버로 이동한 후 처리된 후 서버는 새 틱을 보냅니다. 또한 서버의 시스템 타이머가 천문 시간과 동기화되는 방식도 알려져 있지 않습니다. 2014/09/01 04:15 ~ 06:15 모스크바 시간(목요일, 거래일) 천문학적 편차가 아닌 31개 기업 평균 편차로 파악했습니다. 25개 시점에 대한 그림은 다음과 같은 편차를 보여줍니다(ms 단위가 아닌 초 단위).

그리고 서버의 데이터에 따라 밀리초 만에 무언가를 찾는 요점이 무엇입니까?

두 번째 옵션은 더 명확합니다. 컴퓨터에서 천문 시간과의 동기화가 사용자에게 알려진 오류로 수행되는 경우 천문 시간은 서버가 작동하는 지역에서 동일한 오류(영역의 차이 고려)로 알려져 있습니다. 근데 왜 그럴까...

 

전략 테스터 의 어딘가에서 최적화가 사라졌습니다. 갈까마귀는 내가 이해할 수 없는 아무 가치도 없다. MT4 빌드 1010. Windows 8.1.

최적화를 활성화하는 방법을 알려주세요.

스크린샷을 첨부합니다. 최적화 버튼이 없습니다.

파일:
desktop.zip  129 kb
 
내 MT4 b1010이 기록 데이터에 대한 디버깅을 허용하지 않는 이유는 무엇입니까(버튼 및 메뉴 항목이 활성화되지 않음)? MT5에서는 모든 것이 정상입니다.
 
Patamushta 개발자 금지.
 
정수 마법;
int 미끄러짐 = 5, stopL1 = 50, takeP1 = 20;
int 경향,TicketS,TicketB;
이중 rsi,TP,SL;
//+----------------------------------------------- --------------------+
//| 전문가 초기화 기능 |
//+----------------------------------------------- --------------------+
int OnInit()
{
if(숫자 == 3 || 숫자 == 5)
{
미끄러짐 *= 10;
stopL1 *= 10;
takeP1 *= 10;
}

반환(INIT_SUCCESSED);
}
//+----------------------------------------------- --------------------+
//| 전문적인 초기화 해제 기능 |
//+----------------------------------------------- --------------------+
무효 OnDeinit(const int 이유)
{

}
//+----------------------------------------------- --------------------+
//| 전문가 틱 기능 |
//+----------------------------------------------- --------------------+
무효 OnTick()
{
이중 상품구매 = FindLastOrderPrise(OP_BUY);
이중 상품 선택 = FindLastOrderPrise(OP_SELL);
이중 frezeelevl = MarketInfo(OrderSymbol(),MODE_FREEZELEVEL);
rsi = iRSI(기호(), PERIOD_D1,7 ,PRICE_CLOSE,0);
추세 = WhatTrend();
if (CountTrades() == 0)
{
if(추세 == 1 && rsi <=30)
{
if(OrderSend(Symbol(),OP_BUYLIMIT,0.10,Ask,Slippage,0,0,"첫 구매 주문 세트",Magik,0)== true)
{
티켓B = 마지막 티켓 찾기(OP_BUY);
if(티켓B>0)
{
SL = 상품구매 + NormalizeDouble(takeP1 * 포인트, 자릿수);
TP = 상품구매 - NormalizeDouble(stopL1 * 포인트, 자릿수);
if(OrderModify(TicketB,priseBuy,SL,TP,0)== true)
댓글("만세");
}

}
}// if(추세 == 1 && rsi <=30)
그렇지 않으면(추세 == 2 && rsi >= 70)
{
if(OrderSend (Symbol(),OP_SELLLIMIT,0.10,Bid,Slippage,0,0,"첫 번째 주문 세트",Magik,0)== true)
{
for(int i = OrdersTotal()-1;i >0;i--)
{
주문 선택(i,SELECT_BY_TICKET,MODE_TRADES);
if (OrderType()== OP_SELL && OrderMagicNumber() == Magic)
{
더블 sl = OrderOpenPrice() + NormalizeDouble(stopL1 * 포인트, 숫자);
이중 tp = OrderOpenPrice() - NormalizeDouble(takeP1 * 점, 자릿수);
if(OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0)==true)break;
그렇지 않으면 계속하십시오.
}
}
}
}
}//if (CountTrades() == 0)

}

나는 유능한 프로그래머에게 내 실수가 무엇인지 설명하도록 요청합니다 ?? 왜 순서가 수정되지 않았습니까!!! 컴파일러는 동시에 오류를 제공하지 않습니다

 
교과서를 공부했다.. 읽고.. 구체적으로 오류를 지적해 주실 수 있어요.. 컴파일러가 오류를 주지 않고 테스터에 오류가 없기 때문입니다. 그러나 순서는 수정되지 않습니다. 마치 수정 순서가 있는 것처럼 프로그램에서 전혀 보이지 않습니다
 
burbur87 :
교과서를 공부했다.. 읽고.. 구체적으로 오류를 지적해 주실 수 있어요.. 컴파일러가 오류를 주지 않고 테스터에 오류가 없기 때문입니다. 그러나 순서는 수정되지 않습니다. 마치 수정 순서가 있는 것처럼 프로그램에서 전혀 보이지 않습니다

OrderSend() 가 반환하는 내용을 주의 깊게 읽으십시오.

 if ( OrderSend ( Symbol (),OP_SELLLIMIT, 0.10 ,Bid,Slippage, 0 , 0 , "первый ордер сел установлен" ,Magik, 0 ) > 0 )

그리고 예, 나는 이것을 할 것입니다:

   int ticket= OrderSend ( Symbol (),OP_SELLLIMIT, 0.10 ,Bid,Slippage, 0 , 0 , "первый ордер сел установлен" ,Magik, 0 );
   if (ticket>= 0 )
      {
         if ( OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES))
          {
             if (OrderStopLoss()== 0 || OrderTakeProfit()== 0 )
             {
               double sl = OrderOpenPrice() + NormalizeDouble (stopL1 * Point , Digits );
               double tp = OrderOpenPrice() - NormalizeDouble (takeP1 * Point , Digits );
               if (!OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp, 0 )) Print ( "Error " , GetLastError (), " modify order " ,ticket);
             }
          }
      }
 
Sepulca :

OrderSend()가 반환하는 내용을 주의 깊게 읽으십시오.

 if (ticket>= 0 )

그리고 예, 나는 이것을 할 것입니다:

티켓이 0과 같을 수 있습니까?