1010111100001111111010111011101111011000100000110100011001000011000100011000011000111010011010101100111100000011000110111100000011000000001101010001100010001011110101100110100111111010011111011110011111011001000000001001000010100011001101001111101011011101110000001101000111101011110100010011000011111010010100010011011101101000001110000010010111001010110100000100011000100010101110000010100011100011 1001100100111110110000001101101011001111101101101100010101010111110111010100100100110011101010010000000011101011001001101010101110110001100001110101010010000011101000101111001101111111011001000001011101110011100110011000111111110011010000111010001110100111000010111101110000011000001101000110110000011000110010111101011110011000011100010011111101111110100010111100010001100011101101010000110010011010 1000111110111111010011110011101000101110111000000011100000000110110111011101101100011011101100000110001101000010100111111011101011001101011011001011111110100110110001001100011110011110101010011111001100101001010000010001010111000001110001100100000110010100010011100101000000011100100010011010000010101010110001010000111011100010000100100001011110000100100100010011111110000100010011011110111011110110 0001001101011010000110000011001110001000001010110011111101001110111011111010101111100101011100001001101100111111101111111010011100011000010010101011101011001100110001010010100100100010100001100010000001010001100000000110110001101011000010011100110000000000010111000000001101000101110011001110100001111111010100000110110000100101000011000010110101100001101000011110111000100111001011011111010100010111 1100100011010011010010100111110100000011101110110101100010110010100100101101011101010110000010100001101110100000101001010101010011011101001110000111100011001000011011011100111011001011110110101100101010010111011011000110011111101011011011011001100010001100011000000010100111111010000010001011001101101110001001110000101010110011010111101100011010110001111100001010110100110101111111110000100101000100 0111111101001111101111111001110011001010101101001010011111111100100101001110101101010101011111110101001111000111011011101001111010001111101110101110001101010101000110111111001110011100100011101010001000101010110101110101101110000101110110111011010101100111100111101111011110011001000101000000111010011110010011110100001111011101000010111000111010000010101100011100110111000101100101101001010101000111 1111110011000101111101111001000010010010010101011000000110110101010000111101011011010110100111100001110100011000101001000000001101101111011001110001101101100000001111100001011100111101100101110100100110000111110100101001111000000011011111001111100001110000001110011111100011101101101010011100011000001000001011100100001001011001111011110011101001000000101000100111111111100101111110100110000000011000 1011001010110000101001111101111001000001111111010011110011010110011000111001101110001011110111110101001110110100000110001100000110000010011000001111110010011101111100011000111010101100110111001101101110101100110010000101000000010101110001001101001000100100101111011101100100010111000111011001111010010001101000010111100110101011011011110110111000111101000010011011010001011111000010101010010001100010 0100110001001011001001111001010000010110000010111111110000000011000011011000111001110000011011000000001111100010110000000100101101001110001110001011010101101001001000110000100110110001100111010011101010111111100010110010101011010000010110011011011100011000100000000100100011100010000010010110111000010000101101110111100000100100011010010011100101111011101011101011011110011010000010110000111111001100 0010011100100101000000011110011000000000110100011111011111010111100111110111000011101101001000101101101010000110010111000110000100000010101111101001111111100011001010000110101000000101000011001110011101101101010011111101111000110001111101010000100111111111101110111101101100011101100010010100100110111001011011100111000100001111011110000010011111110110100110001001001001101010110111111100011010001111 0111111100011110100001100000001011100111000011100011011000011100110110011100101010010011110110111000001010100110010100101110100101110100111010101010101101010001110000110111111010100001101110000101000000011111010101011011001100010001101101100011001001001100100001001010111110001100111000110100110111101100000110001011110101001010000001101011011000111111000101111000111100110011101111110111001011101111 0010111111000010010110111011011010100011011010011001111111010000101000110011010110011001011000100100010001001110011001010101001111011001010001111101001001010111001001001101101101010111000000011011110001111100001000100011001010001100101010100010111101111000100111011100110101111100111011000011101110000110110000110001110100110011100101100010000010100000111001011100010010101101110110110101111011111101 1110010011101100001110110001011011011000111010111010111111011111110111011000001011001111111110111001010100011010111110111101100000010100111100101011110100010011110100110010001011000111000111101100000011001100011011000000111111110100101110011011000110001010100110001101101011001001001000000011011101010000100001100101111011001100111010001100110101110011100011000111110100100001000000011011001011001100 1100111001001010110011100111000101100010101100100000101111001110011101101110000011101000101101001111110111011001100111011101110110011001111100111110010001110011110011101110010011110000001010011011010001010111101000110010100010000001110011111001001001100010001001000100001011111111001000111001000001101000100101100110011010111111101000111101000010101100111000101110100110101001010100001100101110101100 0100011110011111111111011001000110011101010111010111010110010100110000010110011101101100100010010011100101010000000001101000001100100111111110000001110011011010000111111111100010000100110000011100100011001100010001001111000101000101100000110101011001100101011111110111110110011001001001110111111111100100111011110101101011111100001011111010110100001001101000011011111010111110010111100100000100100100 1000000001110111010110011110001011101000011011010111011001101001011100101001001000100011000101110111110001000111001001110100000111010010011110100011000000010010100100100101110110101111001100110011110101000010010110011100110110101100000000011001100010110101110011001011110001000010100100001101101001110110001100111011000100101000110100011111111100000110101001111010001010001011010000100011100111011001 0010111010111001011001111001010001000011111010011100111111101011111010101101101011101111101001000110011111111111111011011101101001110100100100111000001001011001111010101000110110000000010100101100001001000111000001101010010111011010010010111110001010011001010011010100011111001000010001011000111100111111001011010000010101001110000111111011001010011010110100011011110100111011110010100100111111001101 0111101110011101100000010101011011011000010001111000110011110011000100110010111100110010010110000011001011101001101001001111101101011000011110110010111001001100000111001011000110101001111000101011100111110001110010001111111001100111111110111101000100110111000100011011010001110011001000010011101111100111110101011010110111000110110101001100010111111001100101111010011001001001101000000100101101101100 1010001001101101001010010100011101110101001101001011010110000000011101001000100001101110001100101010010110100100110101001001011110110100000111010000111010110111011101100000111101110111100011011010000110100101100001000011000101001011100000010100011110110011101001101001100010011001011101001111100111010000101110001100000010100010101111010000100001101010000000010011100110101110111010100010111001000011 0100001111111111110101010110111011001000000111011010000001100010011100000000000101011010100101101000110000100110111010001001110000011110101001000100011011111000000010110111000100010111110101010000011000001101101011100010010100100010110111010110001111101010101101101011110001011111111010011011010110010111101011110000001100101010001110010111110000111000110001101011000100011101000110000100001011011111 1111010111111101011001001111001011010110001011001001110010100001000110001010110001100111100001110010000111001111100110011010011100011000011011111001001001000000100001111101001111100000100100100111100010101010011011001100111000011010111001101100011101111110000110101001010111000100000010010101101111110010101111001010010000001101111100001111011101100010001000101111111011010001101110011111010110001001 0100110101110100000111100000010010100111000111000010100001101111011001011000010100110100101000110110011011001000010100001000111011110000010100001111111111101111001000101110101000011100111001011110100010000101101110001000010000000011100010100111000010010011110100000010111000011011100011010000101001101010100001111101101110011010000100000100101010110011100010110101101101110101010011110110000101111011 0010010111000101101010110000101011011101001011010001101110101000001010001011001000100100001110011110110010000011010001000100101001100001100001100010100101001011101111010101011110100011011010110111101101100001000110100100011110100100000101000110000100100101111000010110001010011111011000011010010010011110010101101111100011101100001100001001011110100011100101001110110000011011101001001010011011100101 0100110010110001011001000100011100011100001010011110101111000011001010001011100110001100110011111001100010101101010001101000111000010110011010000000110001101101010111101001010101101100100101000101110110000110110001111000101010101011101010100000100000011101000100110001111110000111010000000110011011010101011100011011010101110110011001010001101001011010000000011001000111111001011000010011100010001100 0111100100011011010011110011110011011110100111110001000010011001001011001010110100101001010100010001001010010101001001010000010111011011010010000000101111101011010100110101100101100101001011010010000010000101000101111001000111101101110101111010101110001000111111011001011111110011101010111000101110011011001101000101100011000001100010001000111010001011010100111000001101000100100001001111001100111011 1011111100110001101011010010110001001010000100111101011011001110001101001101000010011101000001010010000010101101110000010001110100001010111110100001001011101000100111110000110011011010001001111000011101011000011000110110001010010110001010001110111101100011000100100110011001001010101010000000000010010100010100001100101001100011000011110011111001111011011110000001000000100111001001011000101110001111 0001011010101010011001001101001000101011110100001110111001110010100100000010101111111101100010010001100100010010000000001000000001110101010100001100010001000011111110011010001001000010001110010001110000011100100100110011111111111100111000111001010011111100100111110000000011011011000010101000000011100011011110111000010000010111010011001000101001010010100001000001001010011101111001111001100101001011 0000111001011001001101001111110101111100100101000001001011001000111001001000011110000100111001011001011100111010100100001101010111001010011010110100001110100100001001011100101010100100000010100010100001001001101111010110101011001101100111000001000111000100100011110100010101010111110000001011001111010010111010110111001101100010100110110100111100000101011011111101110011011111001101000101111101010011 1101101100000011000110011010001011000110001010100011101110011101001001001111000010001011110101100001000100111100010111010010111110001000111100001000011100000111110101000001101000110100010100000110101010010001000110110010011111100011000101000011101011011001011111111000101101100000011001110011101011001010101011111010111111010010111000110100001100001001000111100101111100111100000010000001001101101001 0111111100000010010110010010100000100000011101010010101111001000100101110010101100011010000100011010101011110101011010110100111100101101101001010000100110001110100010000001010001111111011011110110011010001010100101000100110000000001100000101010000110100111000101010001000101011010111010100100100011011111010100100000101011101111001010100010011011101111010111010010100111111111101101011100000101010010 1111000011010110010101010010101110000100100001100110011001100010001110100010100111000100111000110111111100110000110100000011111010111010100001010101010100010101100010001000000001111101000010001101000111000000010001111111010001100110000101101101101011110000101010011011100100101111111010100110100010101011101001110000100010111111100000111010001110100000111001011111110011101000001011101011111110010010 1100000000110100111010101110001100000100110011000110110100010100110100000110010011110000100101001100100111100111100010000101001000101101111000100111111010010100111110100000000010101100110011111001010011001111001110111000011111100100101010010011100100000110101011100110011010011000001011000110101100100111010101111111011111001111001001010000101001011000101001000000011100100010010011100111111101111110 0010011011011010010010101101001111101000101100111001111101101100100111111000010101111100010011011100001100100000011111110001101110001100010011101101000111010101101001111111001011011001011000101000001010101010110101010001100011011011111100000110011111101101000011101010011000110000100111100111111111011000100000011110001101110000100101110000110000111100100111011011101110010010101111010111101111000111 0100101110110100001100111010000111110011010011010011101010101011000100010110101100111011000110110000000011000111011100100011011110010101111100110011111001001000100111001000011101000101100001110011010100001011010000111100111001000010001001110001111101101111111101110010000001000100001111000000101011101000111010101111011110111011111011111111111100100010101011111111101010101000010000001011111000110000 1000000111001111110011010011010000011000100001111011100011100011011011111001011000011011110110001111010100101101001111011011011111110110001110110110100011011100101110111101010101111111110110000100000110100101000000101101000000001001001001101011000111011101111110010011110011010011111011000010100110000101001000011011100101110010111011001010110111001111100001101010000000100101000001110000011110011100 0100000111010111100110110011111011100111101110001111001100101010110000001110110000001010100100100101101000010001011101101000011111001001100100110000100101011000110001111110010111100011101011111111010110011110100111100000011100000000111110110110101111110101001100001011011010011100101101001001001111011010011110111011001100011111001101001111001010111101100010100100010110000000010100011101101000111111 1010101011000000000100100101011111000101001101100010010000000011000010100110110010001101001110010001011010010111110111100001101000010010010101000101000100110000000110001111010000010101011110111010101100101000000011100010111001101100110000001101011011100110000000001111100110100010011000001100111010001011110000011101111110001101101101110111010111101010010011000110011101001000000000101101100110011000 1001000111010011111111110101000111111011110001000101101110010011001010110010011110010101100000001100110100010011000000101101001110000011011000110010001011101110101101011001010010000010111000111000011110110010110000011000001000111010000011100011100111000000110101100111011000100100101000011001111111010110110000010111011010001111001100110011101100011011110111110100001001001101010111110110011111011101 0010010010011110011111000101001111100110011110110000001110010100000001110010001111110100001111010111110101110111010011011001101110110110110101010111111111010101111000100000010011000100100001000101111110110100100101110011111010100110101110100110100101000001011011001111001111111001101101001100000011011001000010111010010100110011110100100110001010101110100000101011101011111110101111111000100001000011 0100000001001011000011110000110001111110101000110100010110110011111101101110110111010010110011100110001011111100010101010011101010110011110001101001101011010111100000010100000101111001110010010011000010111001000010011011000010010001110001110001001010010101100011110111011100111110000111110110111110000000011101100100010101000011010101100101101111010001100100000100111000000110010101011110100010010000 0010111011000001000001010111110100010111110101110101101111100001001111101101101111011100100100010010100000000001101010011110101001000000101010111100001100011010110001001110011010001001111001110101001000000001010000011100010001000000000001111011011001011001111001110100010000011100111101001100000101111110100100001110011110010110110110100111001010001110100000011011011111110100000111111101110010111101 1101010110100000001101110011011010011110111000111101000010110111100010100101011001000001001001100100111111000011011010010011110000100010010000001001100010001101101101111111100100010110000010000011111100001011001111000101001011110110110000101011111001010010000101011111111011101011011100101000110000111100010110111110011000001101011010011000001100111000110100011000000101101101001101100100010110100101 1101000000111010111011111110111101101000001011110011000011010001011001010000000101000011011100010111111010000001110000000001100100111100001101101011010011000101011100111000101001000001111110011100100100000011100001100101100110001000001000001110110111101100010111000110101011111011110110111001100010011110011101011000101110000110000110010100010100111110111110010011000010111010011111000001010010001000 0111100101011101010001110110111100001110001101100100110011011001101100110000111010110110000110001011010111000110001000001100111000010001101001001110100000010010010111111111101111010000111010101101100101000110111100111000101010010110111011101011011001101111000110010000100101111101110111000100001001111000011100110001001100110000011000100000001110111011100100101011110001110010110001011011011110001001 0001000000010101101101110110101010100000111101100011110101001011000100111110011111001010111100000100101101101011110101101100010000111011110001100111010011101000110110011100111110101110110110110001100000010010000101100011010010000101000111001000100001101111100000000101010000011100110111101111100001101111001011100101011111110101101010000110100001011111111001101001110100100000000011000010101000011110 0110101001010110001011111001111011001011010100010110011010001110001010010110010100001100011110001101010101110011000010101001111010100101110111110010110010011000011111111000111101100110001011100111001111100100010101001100110101110111011000110001110000011100001101001111101111011101111100111011000101100111110100101011100100100111000111000101110111000000100111011010001001010110110011110011111001001100 0011000010110101001111110010110101010111100000101111000100010001001101001111011011100111000111000101001100101001100000111000100010010001000110100100101101111100010011011100101100100010011101001100011001101110100101010110111100101101101100000110000001111001011011100001100010111111100110111111000101101000011011110010011101100100011011001001010000111001010001111110101001000011000101001010100101111111 1110011111001001011111101110000110011100000011101011110000111011011011001100000111011001101011001000001100101011011100010010101001001001001000001110111101011000011110000111011001111011101001100001001101001001010011110110100000101010100111011001001101110110011110011011000001100011110110101110011000001001101010000101000101001111110111101110101011011000101111110110100001111000101100011100010101111101 1101000000011010011011001000000010101101000110001010111000011101101100101010110001000101101100111001100000111010010111100111000000101101010000110010001001111001110110110000101001110111111100101000110011101111000010011001001101001111100100111111111011000001110101000110100111010001101101001100010100100101001011100110010100011001101101101010101110101011110111011011010101011000100101111101101011010000 0011010011001110111110001010011011101101000000111111000010100001001110001011110101010101110001001011100010101000010101001110010000101010110010011001110000110100100110011100101111100001101100100101001110110110100101111000111110110001100100001101111000001001001100100101011110011101110010100100001001111100000111101110010000010010101010011011000100110110001011110010100101001110000010001100100111001011 1000011011100000101000111101110110000010011100011101010111110101010101001101101111011111000011001010111011011011011000111101011100110111101100111010110010000011000110001011111100111000100011001010101000000101110001101010111000011111011101100101010011101100011011110001000100001001000101000001100110001110111110111011111000110000010010101010000001001000010100111001111011110000110111001101000011011001 1001101111001111010110100001100001100111110001000110001111110000110001001001101110000110100110010001110011001011111111001111011111110101011010100001011001010111001101101010110011111000101001111011101100001110110101101011100110110011100101100010111110011001100000110000101001111111111111010001111000101011111011110011111010111111001100011011101010010101001101100100001011100000100111011101001001100000 0110010011111000010100110111011110010110101000110011011011011011011011111101110101111110000000110110010101110000010001001111101111010011001000100100111010011001000010110000000100110101101111110110110001110010000111100011000000110011010110000010011111111101001001001011101011111001110010110100111101101010001101010111101101101101110110000000000110011100111110000000010111101111011011000111010110101011 0011011100100111010111111001100000101001011010011010110000011001011110101111010000010111000011000001100011110000110011101001001011001100110011110110000101001000101100101101010011111011111001100100110111010010001101101111100010110111100010100110101000100101001100001110011100001010111011001111101010001100011000110100011110100000010011001011011100010110100010100100010110000101001011111101011100011100 1101001001101110001011101100111010110001010100101001001011001001001001011011101111110000110000101100100111101110111000000101011111000101100001110101011011111010101000110110010101100110110011101101101001111100101111100101001000101010111011110101110110010011010000001001110010111111000111111101000110100110010111001111000010010001110000110011111111001110010111001001001100101011000111011111101111011010 0100101001001111111001110011011001011101000001100110011001100100011011111111101001110100001101110000000100001100011000111101101010110001110110110101011000001011010011001010000000011000011011101110101101100000000110001100001101000010011111101001110000000000000011000010001100010010101011101001110010010101000001110110011000000000110001011110110111000110011010000111010100101000110100000101110111100000 0010100000011001011100000011010001001101010111100110011000010001010100110100001101100000010000000101100010001101000100000001101001110100000000100011101100111001000011110100001001001111001111011011100010000001110111100001011010001011000011110000011100000110100011110010011000001100111010010001101000111100110110010001100011111110010101111110110000011000111110011111110000011001000101010111010101001010 0100111010010011110000011100110010001011000011100001110010011010100011101000101111111101001011011110100111111010101011011000010000001100111011111100001010111110111001101010110110000011110011111001010000100001110111000111010010010100000011010111001000010111001011100111111101100101001001000110000101100111001101100111000100110011111011111101100101100000101110010001001111011000110111111110001100001101 1001110010111011010100101100001011001101100110011100101111001000110111011000110110100000010011101111101101111101000011101001111001001000011101010100101011000110101101101101110001110110000110111011000111001110000001010111100101010011010101101000001000101101111110010100110101100111111110101000111011111101100001000111101101100011110001100110011011100011100011100111001111100101100001100000011000011000 1001010110101011110110010001111110111111110011111001100001101101111010011111011011001000011000000101111111010011011101000100110001001101100101000101000111110111000011101100001000000001110010011011011111011000010000101100000110110100010010001000000101110000011000111101100011000000101011100100010000001001010101000110000101001110010000110010000011001011010011010000111110011101110011100011111011011100 1100010001001000111000111011011011011000101100110001000000111001001011100010101010101011001101110011101101001111011100101000110011111111100011001001011100001111110000011011110010111101001011100010110111100011011010110111011110011010010100001110001111111001111010110001000110011101100011010110100110010010111111000010001100111010100100000011010110111000000110001011011100000111000100100001000001010001 1111111101000010110101110000100101101111010100101100001011001110111010011000000011000110101011001101000110110110110110010111110001000000001100000111011011111110100110110111011111111011100010110000111110110100110000000000010111010100111111011111011010000110011110011000001110001110011011000001000111000100011111100110101001011011001110101010011001100101001011010100100011110100111100101011111010111101 1111000011110110000000000010110010011001000101011111001010010111110101110011011011110101000000110011011111100010100011011101110111111101101011100011011100011101010000000100100000101110100011011000101110010110101110011110111110001010000010001110001000001100001000000011100110010001101010101110100101101001101110111100000010100111110100100100000100011010100000100001110100010000100110111001100110101000 0010111010111100001110001010111001110110110011001101000100011011100000001110000000100111110111011101110010000110100111111000100101100011010000100010001000001000110000111001101000111011101101111101100101001101110011011110010110000101111110101110000010010001100000101010001111101000000001100101000111111001110000010100111010110110110000001010111111001101101100001010110110100101000111111100011100110110 1100111011100001111011111111110100000000000010111010100000011100111011001111000000111011100100110010110010000111001100000001111111001011101110000001111101111110001010011001100001110000111010010010001001100010011111000001001010111010110111101110011010111110011010011110000000001011001000110011101101101111000110111111111101110011100011110100010000001111000001100011000111001100010001001001111001101001 0110110110011011000001101110111110011100010101101011111000001011011000000101010111011011000111111110100011100000110101000000100111111010100001010000011111001010001011101110010000000111111101010010110101111100000000101111100100101100000000010001010000001000001000111111001110001111001011011110110100010100011011110000101010001001110100000001000011111001111001111010111001010100011101010101001011000000 1001000101010100100010111101110101111011110011000100100001100000001100110011011001101111010100011100001011101011100000011101101110000100000100100010010010100101000000111100010011000011011101000111110101100010111011001110001010000010011001000011100101110101000010010011000010101000110011101001110011010111100100100010001111110001110001101110001111111011101100111101111011011000111001001111111100001001 0011100100001110110110100010010110010011100010110001100110001101100011010111110111111111100110011000100001000000011111100010100011111011101011110110001100010101110111110101001010010101110101101101111001100101000110100001001011111100100101001000100011111001110001010000011111000100111101000100001010000101110001011010100110111111001101010101000110111011101100001001101000101101111001010111001001010110 1001010101101010111000000001001110111100011010101010111010100000010111010100100111110001010001101101000000010010110010001101001101010000010100100100110010100010001001010110110100001011000000000000010001001110001100110011110001000001110101100100010100001101010111000000111011100101110100100011111101110011101110010000101110100101011000000000100000100010111010101011011111011001111010010000010011100010 0101001001101011000000100110011000010110111001010100001110110011010101101011111010110110001101000001011101111101111101010100110110010011110110110011000100100110111101011011110010011000010000111101001000011010000011111010001101110111101101111110011000001000111001011101110111001101110111000101000101111011110100000100110110011100100010011010101011111101110111100100110110011100101010111101010101000011 1110100111011000001000010001011100111101100110111100100110110111000000110011111000101100010110110100000101111011001010111110011111101010110001011011001101101001100101101001001101100111100100110110110000000101100001101101100101011000001110010011110011001010111100101011110001111111111010110110001001101101011111111111100110000000111011111101110100001001101011101010001001000000101100101111100010010100 0000001010010110011101100010101011101001111011011101101100101100011110010001011101111111111111100110010110000100111010001111101010010111110001101100011011101000011111000101110111001010110101101101100110110101000011000000110000011000101001011001111110010111010010100110011011101000001110110101010100010101110010110011011111001100010100000111101100100000100000110101111000001011110001100011000110001010 0111010010110111111011100001010101010010100000001110000110101011101111011001001011100000010000101100011000010100000111111111001111010111000001100111001011111011010101110100011011011111100000000110010001101001010110101000001010111101111101111011101010000101000000011011111110000111010111101100111001110110000111011100000101111110111100010000001000111110110010011001101100010111010101111100010101000101 1110101110010010011011010111001001000111110010111100001011011111000100110100100000000010001010001111110001000010110011111100101000001110010110100011111011010111000010001101100001100111010100010110110110010101001001111111000110100111101101100110100001011011000010100001110100110001000010010110000111000000101110010001000001001111110101010101011000000000000010111111001011001010010110011100000101110000 0100011111110010010100010111000111101100111110110011110100000110011101111011010010011010111111110010000001000011001111001101110110000110001001111011010010010001100000101001001110011101100001010010001010110110110011100011110000111110010010010101111001101000101100111111010000101110100111100101011001111010011101011101001110011110000011110010001010110101110100100001100000100011110010110110000011011110 1000011001001010101011011101000110000101111011010100001100100100011010010011010100101110100001011111110101001010010001111111000000010111010010101100001111100100111100101001001010011101000100111100110001010111011110100101010011001000101010111110011100011100010000111010111101001000111000111111111000101000010101000101111111010001110111110011110000101000110100000001101001000001111001100011100011101110 0001010100110010000110101000110101001110000101001011111000011001111111000110000000111011000111111111010111101111000100000111101011001110101100100101000110010011011101100011100001101101101111010110011100110111110001100010101111001101001001000111111000100011000110001100111101100100110010110010010110111111101011100110010101101010001011001100101110111111100110011110001011010111101011000011111011100000 1110011110111011100001111010010000111010110111110010000110111110101011010001011010010010000111001101101010100110000110110010000010000010110000110011000011110000101011011011000101010100011001001000111101000001011110001101011100001101101000110101011001110001010011101000010101010000011010101001101100011011010111010010010000100001010101100110100011100011000001000010110110100011010001001100001110010101 1111010000101001010001011111100010010111101010011110010100100101110111011010010011101110101110111110000010001001000101001110010101111001111001101010011110110111110011011100010001101011001001101110101101010010101001011101010110111000000000101001101101000011101100110100111011110011111000110011100100010011100110110101010101111110101000011111110011110101001001011011111101101000101101110101001111000111 0111010100001111001001111001101101000010110110101101000000000011101001000000001100000000001010110110000011100010101101010101010111100111101000000111011001010110100110010011101110000001001110011110010000100001101100001011000111100110110110010100110100000010001110110001100111110011000101000111000111011111001111011011101110111101101111101001001111111010011001111110001010111110100100011011110110100001 0000000110110010101001101001000000111010010111101000010000011000000110010001010010011110001001001100110110111101001110011110100010110100000101111010111011101100011101000010100011000001111010101011001100010101110010100101101010011111100101000001010000101110001011010101001001100011011110101001010100000110111001001000001110100101110110011111010010100100110100100100110110011010000111111010000111110101 1000101111101110100001101100110111010010000010110100110000010011110111111101000111011010001000010111001011001101000100010011111111001100101000110101000101010101101010000010110100101000001110011010010100101111001010001010110010100110111100001010001001101001100101110000110000101100100111010010001001100001111001110000011110000010010010100010011010111001100110011111001000100011011111110000111111111101 1001101110000000111010011010011011100011110100111010000010110000100100101100011010100001100110100101000111000010010101110101000111001000111110011100000011011101000010110111101010111110101010100111011000011011100010111010011101111011000000111010010101000101110010100110011100001011111110011110000100011110010111000011100010011001001000101100111010001110100101011001000111110000001001101110010101011010 0000100101000111000011110100101001110010001101000001010111001101101101001000111101111001101110110011011101010001110001110000111100010000101010110100111010000010101000010011100011111101000101100010110111011111110000110101100010111011000110110010000110100000110101010111001100011111011111110001100001011101010110101111101100101111001111111101100000101110011111000101001000100100101001011001111101001001 0000000011011010110001100011110101011001110000101111011000000111111010001011101001000010010111110111111001100110101100000000010000100000110011011111001001110011000100100010010011100101001011010100110101000010100011010111111000010110101100110011111011101000000011011000100101011111110111000000101010001011101011111110110101010100010100011111101011100111010001000000010111101000001100000111111000010001 0001111001111111111011010010110011111111101010001001101111100110110011101011110000110101011010011011111110011001110110001100100101111111010011001100111011000000010010010011000010111000000001100110000111000011101011011101001101010001001010100011010101100010010100010100001101111110001110101100010010010000001011000010111001111010011110110101101010110000111000001000011000110011010101010000111011100000 1000010001111010011100111010100101010011010100000111110010110111001110000100111010101101011001001110100100001110100011110010101001010001110001101010111100111001101011111100011111100001010001001111100101000010101001001110000110000011001100110110101101101010111010101010111000110001100000010010111111001001111001100011011001111000110101000010011111010101111101001111011101111000000111000110101011010000 0010111100010011110010101100000010100001001100101001011100100001101001011011101100101100101011100111011010110101100011000100000001010110101010011010101001000011101100001100000101011100000100010110011111000010001010001101001011101101101000111000001001000110110001100011001101000100101000000000001010110000111010000011110111010110100101000011110000001100011000101011110000011000101101111101000011010011 0100000011110101001110010110110101010011111101011111011011111101001001110010101110011010011001101110001000001010001110101001110001111010101100110110011100000110100001010100100001110010001001101011111001101101010001000010110100010100111011111011101011101100011110111111100101010110010010010110111000011000010111011100100001001000101011000000010000000111011010011011001110000010001101110110011010001100 0110010001110111101110011010101011111100000100110100011000111111111000110111001000001010100110011111101111000011110100010000010111011011001011001010110000011011111000100100100011000010110000101001101010001110100101100010111101100001110100100111000110001100100000000000001100101100011110101111100110010001000110101110010010000110111010011011011111110010100110000111111001001010001001010010111101010000 1111011110011001010001010101111010011110100001000000101000001110011111010001010100011000001111100100101001001001101011100111001111001100000110000110101001111010001010110001000111010010100011100100000101011011101001010010011000000000111000110000110000101110001111010000100010100001001101011011000011000110100101000111010100111001110000011010001011111000110011010100001011000011100101011011001100001001 0010100011110110111010000000111101000010101000011100001011110100101011101111100100001111100111100111011100101001111100001100001010011000001011101010100010001110000110010001111101101001100010001110111000011010110111101000100000110000101100000011010000101100001100110101001100011101111001101101000001100001110010110001000001000101100110100110011001101001011111010100101111000100001000100110011011101110 1101001101110001011111110001101101100100110111111001101101110110001011011101010001001110011100000001000011110111101010001111001110110000111110111101110110000010010111110001000111000101100001111001001000011010110011101100110101101001010111011100000100011010110110010100011011101110011111000110101101010011011111110000101110111001011100110101111011000111101011101000100111111010101101010101100101000111 1011111111011001101001110101001101001111000110111111111100001101101010000110011010111001111010000011011100011010000110100100100000011100111100011111100111010101111010011101100111100100100011101001001100011000100001110110001110100100111110000010110100110010010111100001011011011010001110010100100001010110110111100111000110101001111001101101101011010101010010111100111111100111100001001101000011000101 1110101010110100111011000000100100010010011000101100100101111111101110001110111101000101100000100111000100010000001011100101001010100000111000010000011111001101010101000001101011101000101010010100100011111001100110010100001111100010100111000011101101111011001011101001010000011100001000101000011111100010010100100101100011001000011001100011110100111111111001011010111010000011101011110001011111011000 1101011100000100010111111011011010111100101110111010001000101111010001101011110100010010010000000100001100010101111000011011110001011001000111011111101100010111100101100000100001110110011110011110111101001010110111110101001010100010011000110001010011010111101000101010010000111011110010001110000110110100111110011111100101011110101001001011010000111011010001110111110001100101011001101111111110000110 0001000010101001000001010100110011001000011000011000001110101111111000011110011010101010100100011011111101010111000001001000010000110101110011000100011000100000100011001111111111010110100000101000101110001001011011000000100101111101010000001010001000110111010110001010100101101100110011001111000101001000000110010001111001001011100010000011100001110110101101001111000010111001111111110010011010001101 1001110001011000011110001001011110010111000010011110100100011000110010011101010100011010010010000010110101010111000000010010001001010101000010111111111010011011010001000010110101110101001011011010010011000010011011010001100100000000111000001101101011100000111001011011100000001001001101000111111110001100101110001110111111100001001101100011010100110110001011000110001011010101100000100011011100000100 1010001111100000010101101111000110001110110101110010100001111101100011011010010001001100000010101100001111010001001011011011000000111111111001000111011001101111110110110101011010100001110110001000101011010010010100111011110100010010100010101100111101110011110011001001001101001000111101110110101100101100001101110010110001100110000110010000011101010001001010110100011011010001110000110100100001100000 1001101110100101000010100101101101111111010010010110100111011011011111110010101010000011010111100010101100101001100001100110011111001110000001110011111100100000111010011001110001001001100011110101101101001110010111110101101101010101010100001110011010001010011010000100101100100110101110001111101110010110111101000110110111000101010100001000000101101111110001110101100010010001101100000110010101000100
cTrader Algo

【cAlgo】含み損益状況をリアルタイムに取得する【Tips】

2/10/2021

4年以上前の記事です。内容が古くなっている可能性があります。

Positionの状態をリアルタイムで把握したい

保有中ポジションの情報はPositionsプロパティから取得できます。例えば全ポジションの総含み損益が知りたければ

private double GetTotalUnrealized() {
    double sum = 0;
    foreach(var pos in Positions){
        sum += pos.NetProfit;
    }
    return sum;
}

こんな風なメソッドを作って呼んであげればいいわけです。しかし、総含み損益なんて刻一刻と変わっていくものです。

そこで今回のテーマは、リアルタイムで総損益を使用するにはどのタイミングでこれを呼んで取得すればいいのか、ということです。

 

3つの方法

3つ方法を紹介しますが、手軽→正確(よりリアルタイム)の順で紹介してますので用途に合わせてお使いください。

 

1.OnTickやCalculateで取得する

当たり前の方法ですね。これであれば値動きがあるたびに損益計算がされるので、プログラム稼働中の通貨ペアのポジションだけであればこれでOKです。

protected override void Calculate() {
    var unrealized = GetTotalUnrealized();
    // 表示させる等、なんか処理
}

問題は他の通貨ペアのポジションの損益も正しく取得したい場合です。稼働中通貨ペアで値動きがない限り、他通貨ペアのポジション損益は更新されません

とはいえほとんどの通貨ペアでは数秒に1回くらいは更新されることになると思うので、おおざっぱでいいならこれで十分かもしれません。

 

2.TimerStartを仕掛けてOnTimerで取得する

たぶんそこそこちゃんとやりたいときの一番手軽な方法。cAlgoでのTimerはこんな感じで簡単に使えます。

protected override void Initialize() {
    var interval = new TimeSpan(0, 0, 0, 0, 30);
    Timer.Start(interval); // 30ms間隔でOnTimerを実行させる
}
protected override void OnTimer() {
    var unrealized = GetTotalUnrealized();
    // 表示させる等、なんか処理
}

これだけでTimer.Stopで止めるかプログラム自体を止めるまで、30ms間隔でOnTimer内の処理が実行されるようになります。

例では30ms間隔での実行にしてますが、やりたいことに合わせて変更してください。重たい処理をさせたいならもっと間隔あけた方がいいかもしれません。

逆にとにかく頻繁に処理を行わせたいならさらに短くしてもかまいません。ただしタイマーの精度は15ms程度です。これ以下の値を設定しても、約15ms間隔での実行になります。

 

3.各通貨ペアの値動きに合わせて取得する

ポジションの通貨ペアに値動きがあり次第、損益を更新する。これぞリアルタイムといった感じですね。30ms間隔で行うよりも処理に無駄がありません。ただ上記の方法に比べると少しだけ面倒です。

コピペする場合はファイル冒頭にこれを書き加えておいてください。

using System.Collections.Generic;
using System.Linq;

以下はメインのIndicatorサブクラス内のコードです。(cBotの場合はInitialize()をOnStart()に書き換えて)

private List<Symbol> _symbols;

protected override void Initialize() {
    _symbols = new List<Symbol>();

    // すべてのポジションのSymbolでTickイベントに処理を加える
    foreach (var p in Positions) TryAddSymbol(p.SymbolName);

    //新たなSymbolのPositionが増えたら_symbol追加
    Positions.Opened += args => TryAddSymbol(args.Position.SymbolName);

    //不要なSymbolを解放
    Positions.Closed += args => {
        var symbolName = args.Position.SymbolName;
        if (Positions.Select(pos => pos.SymbolName).Contains(symbolName)) return;
        var symbol = _symbols.Find(s => s.Name == symbolName);
        if (symbol != null) {
            symbol.Tick -= OnSymbolTick;
            _symbols.Remove(symbol);
        }
    };
            
}
//-----------------------------------------------------
// _symbolsになければ追加してTickイベントに処理を加える
private bool TryAddSymbol(string symbolName) {
    if (!_symbols.Select(s => s.Name).Contains(symbolName)) {
        var symbol = Symbols.GetSymbol(symbolName);
        if (symbol == null) throw new ArgumentException();
        symbol.Tick += OnSymbolTick;
        _symbols.Add(symbol);
        return true;
    } else return false;
}

//---------------------------
// リアルタイムで行いたい処理
private void OnSymbolTick(SymbolTickEventArgs args) {
    var unrealized = GetTotalUnrealized();
    // 表示させる等、なんか処理
}

コードがわかりにくかったら申し訳ありません。コメントに書いてある通りの処理をしてるんだな、と思っていただければいいです。

ポジションの各シンボルを取得して、それぞれのシンボルの値動き(Tick)イベントに合わせて総損益を更新しています。

Positionsに変更があったときの処理も忘れないでください。Openedで新しい通貨ペアのポジションが追加されたら新たなシンボルを取得します。Closedの処理はなくても動きますが、無駄なメモリ使うのは嫌なので、不要になったシンボルは解放してます。

もしかしたら、手動エントリーしたすべてのポジションの合計損益がいくら以上になったら即時決済する!みたいなcBot作るならこの方法がいいかもしれませんね。たかだか数十msの違いで結果が変わるかどうか知りませんが、少なくとも精神的には安心感あります。

 

なんかリアルタイム処理したいときにどうぞ

今回はポジションの損益を例に出しましたが、他にも相場状況に合わせてリアルタイム表示させたいとき、例えば一覧表形式でスプレッドを表示させたりだとか、通貨ペアごとにトレンド方向を一覧表示したりとか、なにかしらリアルタイムで行いたい処理がある場合はこれらの方法が使えると思います。

ご参考までに。


まだコメントはありません

新しいコメント

コメントは承認後に公開されます。承認まで次のコメントは投稿できません。

cTrader's Life

© 2025 ajinori