0100110110111000101010100101110000110101010101000101011010010101000000111010110011101001101000011001001111000110100011100000011100101101001000101001110111111111000111101011101011000001001010000000000010110011010110000001001111100001101011101111010110110011110011100001111110010010110001110100100101001110011111010111101001011011110110101110000000011011100010101010000011000010100110010000001100001110 1111110001001101100000110100001011110100100111010011001101100011101011101010000010101100111001111001110010100101100010110010011000101001111110010001010100111111101010110101110000010000110001000110001111100111111100010010000110100011011010111111010100001111110010100010101100111111101010101001100100010010011001010001011101111111011000011100110010111110101000001011000000101110110010100101101110101011 1110100101000000011101010011011000100001100010100011011101101101111101101010010111000101110101000000010000110110111101011011100000100100111000100111010010001110001011001011111000011000011110101100001001101110111110100101000011101010111011010011001000110110011100110001110101010111011110011001001010001111001111111010100111001100010100101111010101001100101111110011010100100010001000111110110101110000 0110010111011000100111001101110110100110010101110011001011010110101011110101110101111010011101100011101001110101101111101100110110011111001010110001001100010010010000110000011010111111101010011000110000110000001010111101001101001100110001111101100000101101000011111000010100101101100101111011110011111011001100000110011001000111011001100010100110010001011101101000111101101001000111111010001110001101 1110111111111100110000001010010100111100101110110100001101010001000011001010001001000010110111101100101110101110110010101110010000000111000110000010011010001110100010101100101101000111010010011100001111110000000110011010110010010011010101101110110001001010101010111011110100101001101110101011100111111110010000101010111110001110010001001000010010101010100000111000010100010111111111100100100000111010 0111100011001111100001001011001101101111111010011111011110010110011111100111010100111101010010111011111111010101001110101010100010100110000000010100111110111111110011101000011111010111000100110010010111000001100101010010111100000011010111011011100111001100111110000111101100001110110010001010011011011011111111111010110100001111000000111010010100000110101001001011010111001010000000011110100011100011 1110100010100110010111101111001011011000000010111110100101011111100000101101001010110010011000110001111001010001000000110010001100001110101000101100111100110110110110010100110101110010111100110001111101111100001101000100001001011001000100101100000111011111000110100100011010011010001000111011100100100010101100111000000001000001100010100000010111110000100010100001001111001010101011000110010000001111 1111111010111011111101010011010101001001000111111101110011111111110010000100110010011100111001010110111100011100011100111011100001111100000001001111011010000100101100100000100111110100110000011000101101111100101000101010111011000001110111101110100100010101100001001101101101001011000101010011101110010111001010100111011010100111111110001000001011101100001010001001010111001101000111011101001100011110 0000011100101101110011001010111111010000100010110010011111110101110101011011110000011000100111111001010000000000111010110000101000111001010101101100101011111000010111001100101011100110011010000111101100101100110100001110011111110011011010001101010000101111111011010001101000111111001011111100000111000010110010010111101111011011010100111101011010010101101110110111000101011101110001110001101111110100 1101001111010011101100001111111001100100110101111100111111111101110001110111111000011111010101110010010010111100110100001011011011101110010100110111010101100011111011100001010000010100101001001001111111101110101000011010100011001101101111011101001100111010101101110100001110010011100011011101110011001000000100110101111011011111101100010011111111100001110010001010000111110011100010111110101111010101 0010000011100111001110100100001100111100100001010010011000100000100010100110001011010010000001011001010100111010001110000110111101110000101111100100110001111110001101001011110001111101011011101110100110011100001110110110100110111001100001111010111000100010011110111110001101011110001111011011011000001000011000110110100110101100011101100110001100110011010101010110011010111111001011010111011111001001 1011000100100001010000010100011000010000110111011011010010110101101111110001001010111001110110100101001110111101100100001101101010101111110011111001111111110001111101101101110111010011101110100101011100110001000110111000111101100110010010010001000101101110110010000111101010101010001011000111011001011110011110011000001101000111010111110001111110001000101111100011010101011110011110100110110000010101 0110010111101111011111110000010011001000110110111110111100000110001010001100100101010111011111100010001110001000110001100001001000011011101000011110011010010011000010000010001001001100000011010101001010110101111111101100100011011111000010001001111100010000111011100000100010101101000010001110001100101011000011011010110001000011111011111110111010000000110011100000100110110001001010001101010001101111 0100010111010111011100101101010011101001110101100001011100000111111010000010110010001000111000001011011111010010101111011000100010010011010110010011100000011001010100011000110111110000111110101100010000000001011100100101101100110101001011111000010011100100100011011001000000100110101100001001011011111100110011010011011001100111001110101111001011001101000110011101010001000001101001000010100110100101 1000001111110101001001110111001010111101011100100101110110000011110111011010101100101010001100011101110000100001001010101110110001100010010010001100010111111101110100111111100000110101000000101101101111100100010110000110001000000011010110001111011101101010000111100110100000001100101001111101011100100011110101100011001001110001000111100111110011010110110000111000000110011010000100011001010111111001 1100000001011110101100011100110011100111010000100010110111010011101100101011111101001011110010110010000110000010111011110010111100110000000100111010001001101010011111010101110000000100010101011001011100001110101111100110001011111100111001001101111001101000100001001110010100101000101001011111000110111100010101110100110000111010111001010001110110101110101100111000001000010111011110111100010010010100 0100110011111000101000111000011011000001110101000110011000111100111001110100011100000100011101110001000000000000000100001000101100100000110000100010000011111110000101011100010000111001110011001111111000111110101101011001000110001000000000101111101010110111000110000100111111110000111101001110001101111001011111001011101001001001001111011010110000100101111010101100000111101100111101100000010101000011 1110111001100100110001010111000111011001010001010010101101010010010110011000000011011111010011001111111110110011010001100100101110011111010001001010001111000001011110001001001001100111010011011111100000011000011011011001100000011110101110110000111110011111110101111101111011101100100101100101001010100000010011001111110100100111111001111110100011101011110010011011110011111100110001100110100011010101 1100100101111010000001100101101111101011101101101110101011100110000110011010100000001011001101010010111011101011011001011101111011010010110111000011000100011011000011101110110111111111011010011001111001110110110010010000100000101011001110001000011000001110101011110000001010010111010100101101010011101011111011011100101110101001011011100000100100111010001110010100100010110110011010111001000001110111 0001101111100010001001011010111000001010010111011010101011100000100100101011100001011100001111010100111000111111001000111010000001000000011010011111111001010111011111100101010110010101011111010001110111101011101011100101010100000011011111000110100111111011011010011100101000011010100010110100010010001111111111110100100111100101100100100111110100001101100101100000010100011111000001101000011010110110 1100001011101000110101000011111011100011000101100100011111000000010100011111000011011011110011100111101110100111101110111111101010011010001110100101000010100110000101100011010001010010001100110110100001000100010010111110000011011110011110101000111000110101101000110011101001101010101101000101110010100111001111100100111001111000110001000000001100011110101001001001000011110101011011111011010000001010 0100110111101111011101001000110100010110100101111111001111001010001101000111011110001010110100001011001010011010011100111010110110101101011111100101110101110001100101010100011010110110000001010110000101011100010110010000110100001000111100110011101001111110100111110110101100100100001101101111110011011011001100000100000101011101101001010000010001100101100101010000000000011110010001011011110001110100 0111101000011001010101010111010010101110100011101100111111011110100010010010111101101000111011110111100010001010010010111001010010101000111001100110111001000100001101001110001111111110101110011110110110100000101110110101100100000110100001100101110001000110110100111010001011111010110100101010110111110111001011111110011001101110000001101110110101111000100111111100110111011011010100011100011101010101 0111010101010011110001001101111010110100100101011111111101100000001110000100110100100010100001100000111110011000011001000110100001111110111101001111111010100101011011011110110101001111001101011001010101001010101111010010000011000111110010001000011000100000001111010100101000110101011010011010001101001110101100010000100100110100111110010011011001000101111100010000110111100010011010010011111111001011 1110011101111110101011000111110111111011100100100101101000110101010110101111001010110011100010011100100111100011000011111111001001110010011100110010100111101100110110110101101110011010010000000001110100111100100101001001010001011000101101010000000010011101101000101000100100011001010010010001000010001100100111110000000000111101110111001110101000011110101100010100010110110111111101110111011100110000 1001101100100000000100011010001010010110111110010010000111101111100010101111010101001001110000000001100010000011100101101010010000101111101100010100011010011000100000010111110101000000111111010110011001000010111111100001111010101001111000100001111000110101010101110001010011101001010011000110101010011110010011011101111001101111101000000011011110100011001010000100101011111110100100111000101101001111 0100111110001010111110100001101101101001111100011101000100001011101111000011010011011111000011000101000010001011101010111010100000011000001001011100100111111010110011111111101100010101000011000000110010000011110011100110001111101100001100011000111001101000111010011011010110100100001110000100101110111111111011011101100011101001011101110000111000111110000000100111001001110001111110011010111010010000 1001011000111100001001010100101001100000000100110000011000011110100001100100010111100101111010100011000110011000001101101110000110111101011111010101001101000100111001011011001110111111101000110011000100011000000011010011111011000110111010001100101111101011001011010000011111101000011111100000001000111011101010111110111001001010000010101111011010001111001001001110010111011101101101010011011011100011 0101000010101010011110111110000001111000000000011101100111010100101110011000100001111101010001100011100100101100010110111101101110011010110110010000110111111001100110010011110010010010111010110101000000111110111101011111100100110100000101011101011111101001111000000100101011100110101001111010011010111101010101101111000101000000111101110001111001100111000110011001101110001000000111010011011000011100 0101000101100111001010011110111110000110000010010110100000011110110101000100100001001111001100101010101100000100000000001110101011000010001111110101010100101001110011110101010100111011100111111111101101111111000010001110111000111101100100011111100101010110001101010110001001101010110010010100100010010001111000010000111110100001101000000001100001010100000010100011010010010010100001101111010100100101 0011000000111111010110110100110000011010111101010000100010110100010001011100111101000110111011100111100100100011110001010110000001000011101000100001001001110011011111101000010000100101000010111111000110111001010111101000101110001101110000100001111011111011111110001101101000100111001001100001010101010110010000000010011010100111010110111011010101110110100000000101010001100001101010011101100111101011 0000010010011101011101111110011010011100110010101100011111011100000111010001110100110001001010100111110101110011011110000101010000110101101001000010100000001011111111101101101000110101001010011110010110011001110110010111101110101000111001100011010111101110100100000010111100001001011011010110101111101000110001001100100001010001100011111101011000111001010110101010011011000010000111000010010100100111 0111011001000011110010110001001011101111111000100101100110001101101011100101100011111100110001010001001001001101011101101100101001001011010000011011111111110001100011101100010110101000101101110100101101011000101111110110100010011101111110011101111000010010010010110000000010110001000010101111110000100101000010100110100111111010100000010111111000000011000001011101110010000010100001001000101011011101 0110001110101100101000111011001111010101111111000101110010000000010011110001000011011111000100001111010010100001000111100100110011101100010110010011011100011001001100111111010011011111101111000111010111100110001101111100111111010111111111001011011000101110000110011101100101100111110001000100000110110100101100111010101110100011011001000010111111111001100001000011110010000000010100101110010100101011 1101110110111010110000001101010100111110100111001000100110101010111000100000000111000111011001001001000111101011110000101010011011100110001110101010001110110010100001111101111010101001011010100001001100011110011000101101111111001110011001101100100010101110100010110011000001001111101011110111110100011110010101001010100011111111100110110100100110100100101001111001010111010100110101100111110010010110 0101011111101110101100011010100100011111010101011111110111100001010010001000100101000101110001100000110100001000000010010101001011010110010101110110100100001000000001000100010111010001000111001000010011111001110000011101101100101111110001111011011100100111101110011010010100110010101110111010011111011101011110001011001110000100100111100011110000101000000001001011100001111111110100000001100000110100 1111111001110001011110010010011100101011110011000110001111011110101000111100011010001111011011101111001111001011100001111110001011110100010100110001110110101000100110100000011111011001101100111011001010110100011100110000000111100110110000011101100010100001111011110110110000111101101011011001100111110111010001000000000110000010000110111001101010011011110110100110101101001111111111101001011111011110 1001011010110001000010110010010011111001111111000100101010000001110101011100111001000111010001000000100000110011000001110010110101100111001100111101000011100111111101111001101000101100001110111000010101110110011111110011110100111011100100000000011101111010011110111101100011101001100110001110100110101010100111100001100100011100111110101011001001100000010010010101111101010101010011001110100000110111 1010101100000111000000100011100110111011011001000110101011001000001011111101001100111100101110100000000111011001111011110111010111101101110011010001000011100110101100100011111010101010010100011111110110111000010011011010100010111000000011000101011001111011100011000110011101000111010000011110101100110111000101000000011110110011000011000000010101101101110100000001011000001101000111001000110100111101 0000001100111101010011111001011010011110010101110101011110000111110111110111110111000010001001101100001010000000101001110111111000100111000001011010010111001010101001100001010101111100101100011001011001101101000011110101001101101100111000011110100000000011100001010100000010001001000101010010000100010101111100011000000101101111000100110111000101000110101010010101100000010011001101110011000101000001 1101010100100000000110110110111111011100111101010101001101001000001101111011001011100001011001001111110001001000010000111010000101010000110010111001100100101010000000110001011101111000000110011010111101001011000000111100000010100010100001011100110101000101100111101011011011110110011101001001000111011101110000011001110101101110011011111110011110110011010000001010101010101101001110011110000000001101 1110000111111101101101011001111101000001011011100000001100000001101011000011000010011010111100110001101101111010100010001001100000111011001011110000111110110001110001110010000110010001010010100100110000110110100011011101011000010001001000011100001000001011110001000010100011101000101001010101001111111011110100101011001111111010001100111111111110010111101010101011110101011111010111010101101110001100 0000011101011101001100101111110000100111110100111010000001010101100011011110111111110111110110111101101011011011010111010001011001000001110110000111111101111101100110100000011011100001111110101000111001010010110011001110010001010101011101010001111011101010001001111100110100101011111010011100111111010000110110101001100110010000001100100011011110011010100111010001001111001111100000100111011001101111 1010111000000000000101000101001111100100101110110110110100001110011101110101001000101010011001000101111101011100101010001000101111001110010010000110100011011000010011111111010111001010111011001101001000110101110110111000000111001010101101101101111011001111101111001110000000001110100101111010101111110111100001111011001010111000010011100001101001011110100010110010111011101101111111100001110001010110 0111111110101101011000101110011011000101000000010101010001000000101011101000000101100001100010000000011101000000000010111110101001001010010110101110111001001101000010101010011011100111101001101010001001110011101100111101110010101100111100110010011101010100011111011011111010110000101101111001100111001111010111001100111011000101100101111010001001000001110000111100010101000000110000100111101010011101 0110011011001001111001001011100110001110100111110111001011011101100110100011000100111010100101110110010110000001011100000010100111100001111010101111001000111111101101111010111010100101010101100011101011010010101110101110001000001111000011100001110000001001110100010010010101010000010001000111101000000000100100101110111001001001010110011100010010000101000110010000001110111001010110101001100001110101 0111001101011101101100000100110011111111100111011010101010101110000001100001110000001001000010111010100111101100101111111101111110011001100011111111101000101100001001111011001111111000011111110100100100110111101111010101001011101011101101011000011001100100111011010100000100100010100111010110100010011000111001110111111010010010001101111101000111111010010110111110000101101010101101110100000111000001 1111011011011011001011101000010011010110100100100110111100010000110001011101111110101000100101011101000001100011000011110101010101001000001111001101010100110110110110110001011111010010111010111001111111101110111010101110011001101111111111011000100100101100110011101000100010100110000010000011101000010101000010111000111100101001011101111110000001111101110111101100110100010011010011101000010111000011 1000001011010111111001101111110100001000001001100001011111100011100111000111001011111111110010111111000100000110111000000110011001001100101110100111000101000001101111000001100010010000101000100111001101010101100100010101110001111111111000111011100110001101110111100100010010000100100111100000101101111110010001111001100010011111100000011111011010100110001011110111010011100001101111111100110010011111 1011001011011001110011101010011101000111000110100000010001110000011001011001111011111111101001110110001101110110010010110101100100000101100111101000010100110111001001001000000101110101010000110101110111110111101101110101101100100000010011001111111111110011001100111100110110011001001110100111011000101001110111100001101010100000111100101100100101011001100101111010011000101011001111011100001100000000 0100100100011100111110011111100110110010000111110101111100101011111111000100100011011101101000111001110010010101101010110101110111111000101101110000101101111001110100101001100010111101011001011110011010110110010100100100000001111101000111001100100000010101111010010010111010010110111110010111101001101100011001011011011100100100010000110000110011111100001110101001001011000000010100001001110011111011 1110001100000100011111110001010001101100100001001110111100011110101100100110000010110010001101000000010111001100010101010011001100001001100100001011001010001110100011010011110100010001000100011110110111110101100001110110000001011110011100011100111100100100110110111010101110010000000010111011011000000101101010001110110111011000010101001111011001000110111010010101110010111010110000101010110000100101 1100101101100111100101000111110110010101000110011100101100100110111101111100000111010101001110100011111010010001111111100000001011001000001011100000111100110010010111110000000010110001001011100001100000110010111111001100011011100101011111110101110110011110000011111100111001010101000010101011000011100101010010100111000111000011010011011000101010000100100100000001000100001011111001100000010000011000 1101011110100011010011010111001001010111001110000011111001110000101101000101001110010110010110011110101000001011001000011100000000001001101011010010001000000011010101011111011111011000010011111000001011101100001011000011111100000111111011010000011101111011101111010000011000100011110010010111001011000001011000000000010000111010100100010011100001100100111000010010101001110110001000101000111111100111 0011111111011001011011100100101011101110110101011100111010011100100101101001100000110011100010101000011010011010101001011010110110011111100111101011000001011111011001001000011010111011101011111000100010010001110110110000100110111010111111011000010010111111010011101110000111101111100011001111000110110000001111001011111110000001111111011000000111011101001010101011000001000101101010001001010001000111 1101010011010111001001111000110101100111000110001010011011011110111100110100111111101110110110111100000110110001100011010001110101101111000001110110010101110100100001001010101111011010000001001001100111001001010100101110011011110000000110100110010100011000010011111011101101000001101100101000000110010011101101110111100101101000010010101101111000111110011001000011010110010001010011111100110110011001 0100110001110110111011010110111111010011011001010010010001000001111000001100011011111001101100001101111111001110010011100011111000100110111111101011000110101001010100111101111010000001001100100000001010010001100100001100000010100000011000010011111111010101010111000000001110101011111001100101001010001001111000001111010000011011010010000000111010110101011110110110101010100011110110001100100000011001 0100000011001011101111100011010100100101011001010011000011100101111000001101110001010000000101100101111100000100001011000101010100011111001111111011101111111110010100101100001110101110001010110111001110001010101110011111001101101100100011100101100011110101110011101000010101001100101011100010111001111001101000101010100101001011100101111100011001101111111110110100101000010111000001011100010111011111 0111011111011000010110000001100111010001101110111001101111010100000110111010110000101110101000000100110100000100111000101110101111110010010101000000011101010010011010100100000111011010110010001101101010111001101001110001110111010101010001011101011001010111110011101011000111001011100100000111100010110010111000100101000111110000011111100101101110111010011010010111101000110100111010001111100101101010 0100001100010011100011011111110110001010101001001100101111010010010111110110110100111010011110101111100010011111110111000000100010011100101100110111100101110011001100000010110010110001010000001000011111001101001010111110001010001000101000100100100101010100011000101110011111001100111011011100010101111000010101001110100011100010001011011110110100111001111011010100111011011001010100001111110111100101 1011001001001110111101000100001010000011110001001100110101011000101110010101000101000011001111001011100100011001111000101100110110111111011111110010111101110010000001011001010000101010110110001000011001100111010010001011000011000101111010111111101101010111011000110011000011100010100111011111100100111010100101111010000010010000110100100000100001010100001100101111101001111011011001101001110011011110 1010000101000110010010111010100101000010110101100000110010000011100001110001101000000000111000010111101001110001000000110000011000001111000110110010010100111111000011010011001001110001000100000101110000111011110111000001110101010101011011000110100101110010100110101100110110111011111111000110000001010000101100110101110111010010100110110101110001010011100010010001110111101110011101111110000001111110 0011010011101000010001111111000100001000100000010101111000110111111001101101100010011111010010110100100101110010111110001111110100011011001100100111011000101100100011100000110111010001100100010100100010110000100111110110101110110100011101000001110000000101110001001110101011111001101010100101110011000010110000110110100100111001100101111101001010100100001010111111001100010010100110110000100111010011 0101000101000011101111110111111111101110100000000101100001000001101011000011111001101001100001100000110000011110110100111101010001010011111100100100111000001110000101011010011001001011011101110111111111001011101101010100010110011000011110111111100110111010001001100111001111101010100001100001100111001110000111010110100111010000000001111000100011001010111111100101101000010100100000011010100000011011 1010010011110010111111001011000101100000001011001010111011001010111011001111011000100110100101011100100000000111111100101100100110101001111010001111110110100001111000100101110101101100110011011001110000001001100011001001011011100000100101001001011100111101101001010000011111100101111010101111000110010000010111011100001010010000111111011000111100111011100010000011100011110101110000011101010110111000 1111001010011101100010101110010011010011101001000100100000101101101001111101010111100001111010110110010111101111111111100011011010111000010010101011011010111000100011110000010101100110110011000101001000111010001101100000100010000000001000111110010011101111001110110001001011100110101010101010110011000111101000100010001001100001011001010110001101011111010010000111011000010111000001101111001111001011 1101011111000001011110011010001001111000101011001110010011100111011001000100110000101001010010100001100001100000010011110110001000001011110110101011001000110110000000010010010010001011000000001111100010110101100101101001011110100111001110101001111111010111110011000110100010111101111111111111010110101010010000111100110111110111110100011011101101111110111000100010011101010100001011000001110100110101 1000000011110000100001011110001110100000100011001110000111000101111000011010000001101101001010110110000001100001110100100011110011100011010011101100101100101010100111000011111111110011001100110001100110000110100100011101111110000011101100000010001100010011111000101101000101001010000000000000001000010001011000110101111110101100110011111011010101111011111010100001011111101100111010111000110110110001 1001000011010011101010100101111011100010010101100101110011001001001111101101110111100010100011101110010010100001011001000010001111101000011100110000011111000001110100001011101001111000001110001110111111111100000100100101010100111011000001010111000011101100000101000001001101011100100001111001010110001000011001010001101011110000101110010110011100001000010001111100110011000001011111101100010010111100 1111011100011001010111000110101101100111110110001101001011101100110000001000000110100011000101100110010011111011100111100011110101011101111000100001010110000000110110001110101011100000100110110000010001100011001111000110111110010110001011101101101010111000010010111110011011000000000000111110001111001001100010101111110111101101001001001111110010001001001010101110000011001101101011101110011011110001 0000110001111100100101110011111000100011100100110110000111000000000100110010010100100001000000101010001101000100101100100000100111010001000001110101001001010111101101111000101001101101110111111000110000111011110010010000011011110000111100011000101011011010110001000100011000010111111101010000110110111111100111000000111110000001000011101101111001111100101111101110011001111011010100001011000001011011 1110000111001101011110110101001111011101110011111010101011000000110111111001111011010011100010010101000011000001011010001100011111111100011100110001101110001011001000010111000011101010011000001010010010001010111011100000101010000011110010101110000010000010000101001100110111100010011000110111100110011111000111011111001101010000000111100010001011001111100101011101010100111100101100110000001100100001 0110101101100010001100010011100010001100111001000110110111100100111001100100011111100001000111111110000011111000011100100010000001101000001111001000010111101100001011000111110010101111111101001101101100111000011001000111001000000100111101001001010100001110010001111100111011111001011100010011100101010010011111101011110000000111100100011011101100000010110110111001100001100111010100000110101001000011 1011011011111101111100101010000100101000010101110101001010110110111010001000100110100110001011110101011001011100010010110011001110101000010000000001111111000000011000000100101100111111001001111011100000001111100111001011000101010000011001111100011011110101000100010000011100000000101010011011010101111000010010001101011001100101100000101010100010001100010001011101100000100001101011100111000011111101 1000000111111101011010110010100110011110001001011000100111100101010100001100011010110101001110111001110000101010101111100010010011001110100101111101001001000101111011000111001111111101101111001011011000000000010010101101010110011101010101000011111010010111000010111000110000100000110110010100111010101100100101111111010001111100011010001101101101000001010111011010001010110010010111011010111010001101 1011001001001110110100101010110110110011010010001101101011111101010011101110110111000100100011001110000101011100010001010000001010101111100110010101001010000010001111100011111010110100011001001000100000000110011000101100111111001101001010010110000110011011010001110000100111001110110111000011101101001111100001011010000010001010111111100011011110011110101100110110010000101010010011001100001010101100 1011000100010010100111110011101110000100111100101111001000100001111100000010110011110000111001100111110100000000110101001010001001101001010001101111011010000101001011011000001110011000010110111110010101100000100110100010111111001111010111100111011110111101110101000110100111100100011000100110011100101001110101111001110110000001100110000001001111010011001010110110001000101000000100111110110110110101 0100001010001100000110110010111001110110010100010111110010010011100001011101000111011000111111011101101110101000110000101110000000111001010010111010001001101001101010101101101111010000111111101101001110110110010100010010001101010011001010100011100001110000011111001111001010101110101111000010010011110011001010010110000100101110111011000111101111100000000000010000010000011001100101001000101110000010 0000001101100000001000100010100011111000000010110110110010010110110101000101110011110001110111000101100001101010111100001011111111110010001110111010100001111000011101001100111110001101010111110101100111101000011111110110100110100111110001011101010010111000001001000101011001011011100111011001011000000111101101001011001110110101000001000101001010001011100011110000101010101011110010001011100111010001 1000100100000000011111010011110010000111010111101011111101111001001011010111110101011110011100001111100001011101010110110000111111010010001010011000100100101001001111101100101111100010101100100000110000111011111011100100000110100101111000010001110110111110010001001101110101111110001100001100011000010001011011100111011010100110101011000000001011110010101011110010001100000111010001011000110000111000 1110101001001100001101001100111011110110000100110011011010101000100100111011010101110110010100000100110100110110101101011100111101010011000000100010010111101011001000101010000101011010100001010010010100001100110100001100110101000001001111010010010000001100000101100101000011101111010110011100111100001110010010000100111101110111100100101111101111110010101100100110101101000101111101111011111011111101 0100111111111111011001010101011101100101101000110010011110001010000010001111011110001001010001101101110010111001000000010101011101000010011000111100111111000111001100000010001011011101110001001000111100011010010010000011101010111001101100001111011001001111010100010100111010110010101010100111001101100010001011111100011100111011011011111011011001000111010011111001011101111000010001110000100101110110 0111101101011110101000010111100000000000010110110100111110000100100000010001001001011010101010111001101000101011101110110110010110000000100101000110100001100101101100001010111011100001110011000110101111001000010110101110001011011111101111001100111000010101010100010011010011101001101001101000100000101011010101000001010100100101100101011001110000100000101110100001011000111001110100000010011100001000 0010111111101111011101111000101011111100000010000011100011011010110100010010000000100011100001110111001110110011101011000101010110111000000111010110000100111001101010111111000111011101111000001011000100100001001000111010101100111001000110100101111111011110000011111100100111011000010110101101010001111001011010010111110010110111101010110110010000010011010000001110110110001101011101100111101001000001 0111001001011110101000110011000110001110001000101000110001101010101001011100011000010100101010111101011110100111111000100011101110001000101010010111001000111011011101001001100001000110000010010011100110000101001110110111101110011111111101110001111000100011001101111100000110101000110001111101001111010101100000000001110000100110110000111100011110010001010000101010100110011111111010110010101110101011 1000001010111011000001000010000011111001001001000011001110011101110000110011101001001001111011110100100010010111110001011000001100110101100010110111010010011011000010101111100000001101100010100100001111101011111011010101100001100011111000001110100000101110011011101100000000011001010001100110011100011000001100100100111101010011111111100011010011100101110110110110100100100110100100110001111101110001 0100001101101100011010011010111110100000000000000010010010111101111111110111001010101000101000111110000000001001001010010001000010110110001000010011100001000100010100011001000010000001000101001111101010000011011111011000110101011101100000111011000110111100010001111011001000100101100101010001001010110010011100110101001111110011000111101111011011111101010110011100001100101011011111110100001101001111 0000000011001100010011101101000101100011000011100001111001101110011111000100101000101111000001000011010010100100111111010110011001101001011010010110101101111100001110110101000101001010011101011100101110100000100011010110000011000011100100111110110110011000010000011000110010101000100101110001110011011001011111011000110101110011001000101101111111110111101110110000100111110000110101011100010100001001 0111101110111001000010010011000010111010111101001110110001101011001101101100100110011011111010101110100111001101001110111001110111111001111011100011001011111011111111100110100101110000101001001000111101101011111110111101110000101101110001001001110110010010101111101101011101001101111101110010110001010010111010111010110000100000111110110000010011000010101101101000010110110101111101100111011001001101 1111011000000011110001001011111110000010110110011111101011100011111010000111110001101101011101110001110110011101001011111110001110001100111010001101011100011001110110101110000111100000001111000011010000001110000111001100000110010101000000001010000100111110111101000010111101100001000010000001001010101100010001011010110000110010101011000110001010100000110101001011110011110010011111011101111011011010 1001001010011000111001001100001101100100110111110000100011110011001011011000011001001101111101000101000110010100000100001000010111001011001000011011011011010100111010000111001000111001101011110010111111011111111110111111000010011000110011011011111110100101101100110010010000111000000111101011111110001110001100001000001101000000111011010101110100001111111011011100010010111110111110111010001111001111 1001011000000101011100101100110110001110000111001110000110001101110110101110010000000001000011111101110111000001100011111100001100010100011110101101001111100110101100110001000001100101011001111101000001100001001010000101010000110010011110100011101010001001101000100001101100110110111001000100001110011001001101101001000110001110010111010100101111111010100100000111010011101100011011000001111010001110 0010010101101000010110101001111110011000111011100110000100101011011110110100011001011000110100000010001001001000101011111100110101101000010001101010111101000100001001011001011010001001010100100110101011011101000011110110110000111100101100000011110101011001110111111101011001010100110110011110111011000111100001100101110000100000100101010100100001010110001000110110110011001101110101101011110110110111 0100011110110101101110111000001000010011101001110001011111000111010000000111010101000010001100111110101010110010000110101000111100000001000101000111110111110101000110111100111001101100001100111110010011100111111000111011010110111111011111011001001110100001000101001001100011111110000010010011110101000001000110010100111101001101010000000000111001011001000100000010110000110001111010011011010010000101 0011100001001111001101010010100110011010001100000000010001100110000001010111100011001010000001111000111110111010110101110011110101100100110011001010010101100011010010001111010110001100000110011011110011101111111001010000010111001011111101100000011111000001011111101101101110000000110010111001110010101101011111110000000011110001000010001101010001110000101111100101001011001111000101001110101111110010 0010111011000101001000000001000011010001111100111000101001011010010011111010110101110000011100110011100011001011010111000011011001000010001010011101111101010011001001101011110011011101111110001000100001101110010101100010101111101100111110100101100100100101010100010010011101111011101000010100110010000100000001100111001111010011100001111110001000000101101000110100011001010100000100010101010110111000 1101100111110010000001100111111110010110110100101001100010000001011010010010101010010101100101010110100010100000010111100001000100100100001001010000110010000101010000101101001110111101110011110100001010110111111111000001001101101011101010001001111110001111011010101011001100011011100000110011011110100010111100010000010100000001001110010101100000011011101011010110011001110010010110110111000111110011 0001011101101011011001111001000110010011100100101110100110011011111001001111100010010101011100100100010001011010100101000101110011101010010100011000111101001001000111111100011010000000010100111001011101110011110111100110011011110110001010101111010001010101000100000001101101011011000101001111011111101100001001100010000101001111000110000010011011111100110011011100011001100110100101111111101110001110 1111000110001110101000110100011010011000010111000110001010110101111101100001000011011110011101110101110110111001010110101100101111111001011100100011111100110110111000100100101001110000111001101001010111011111111001111101110000001000000111110010101001110011110001101001010000101111011101001100000001101011011001100101110100011000000011011001110001000011010111111011000010111001011010011111101001111111 0100001110111011011111110110111001011101101011010110101001101000101111001001100010001000111101100101000001110101011000000010000110111110111010111100010010010000001101011011000000011001011101010101010011111000101110110101010100111110100101001110100111011101011001001001011101000110110101011101110010010111101101100011101010011111011111010000111000010001111111011011101010110000110010001010101111010101
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